出題編 アクセス指定子private,public,protectedを用いてクラスの継承を行った場合 どのように親クラスのメンバ変数宣言、メンバ関数宣言は子クラスに引き継がれるのでしょうか?

親クラスから子クラスへ継承を行う際 使用できるアクセス指定子は puplic  protected  private の3つがあります

ソーラー「😊😊さあ、今日は どんなお話になるかな?


親クラスGameCharacter


から


子クラスDragon



クラスの継承を行うには


子クラスDragonのクラス宣言の定義の


class Dragonに


:public GameCharacter


をくっつけて


class Dragon:public GameCharacter


のように記述しました。


そのときのプログラムはこちらになります。

👇


#include <iostream>

#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています

using namespace std;


//👇🌞🌞🌞クラスGameCharacterです🌞🌞🌞

class GameCharacter {


public:

string name;

int HP;

int MP;


void statusDataDisplay();


//クラスGameCharacterにはDragonタイプのキャラクターのみが使用できるuseFireRecovery(GameCharacter& a)を設定しません

};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

cout << "HP " << HP << "\n";

cout << "MP " << MP << "\n";

}





//👇🌞🌞🌞クラスGameCharacterを継承した子クラスDragonです🌞🌞🌞


class Dragon:public GameCharacter {

public:

void useFireRecovery(GameCharacter& a);


};



void Dragon::useFireRecovery(GameCharacter& a) {

cout << name << "は灼熱のフレアを" << a.name << "に吐いた !" << "\n";

cout << a.name << "は灼熱のフレアを受け燃え上がった!" << "\n";


a.HP += 10;


cout << a.name << "の体力は10回復した" << "\n";


}


int main() {


GameCharacter Lyliane;


Lyliane.name = "リリアーネ";

Lyliane.HP = 10;

Lyliane.MP = 8;


Dragon Pokky;

Pokky.name = "ポッキー";

Pokky.HP = 15;

Pokky.MP = 5;


Lyliane.statusDataDisplay();

Pokky.statusDataDisplay();


Pokky.useFireRecovery(Lyliane);


Lyliane.statusDataDisplay();

Pokky.statusDataDisplay();



return 0;

}



プログラムの実行結果


リリアーネ

HP 10

MP 8

ポッキー

HP 15

MP 5

ポッキーは灼熱のフレアをリリアーネに吐いた!

リリアーネは灼熱のフレアを受け燃え上がった!

リリアーネの体力は10回復した

リリアーネ

HP 20

MP 8

ポッキー

HP 15

MP 5




ソーラー「このプログラムでは


親クラスGameCharacter


から


子クラスDragon



クラスの継承を行っています



このとき


子クラスDragonのクラス宣言の定義の


class Dragonに


:public GameCharacter


をくっつけて


class Dragon:public GameCharacter


のように記述しました。


ここでの注目ポイントは


class Dragon:public GameCharacter


のなかの


アクセス指定子


public


なんです。」


マックス「そういや


なぜか

アクセス指定子

public


がくっついていたよな。


アクセス指定子

public

なしで


class Dragon:GameCharacter


と記述してあってもいいんじゃないか」


~ ~ ~ ~ ~ ~ ~(´▽`*)~ ~ ~ ~ ~ ~ ~


それもそうですね。


class Dragon:public GameCharacter

class Dragon:GameCharacter


と記述したときのプログラムを実行してみます。


#include <iostream>

#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています

using namespace std;


//👇🌞🌞🌞クラスGameCharacterです🌞🌞🌞

class GameCharacter {


public:

string name;

int HP;

int MP;


void statusDataDisplay();


//クラスGameCharacterにはDragonタイプのキャラクターのみが使用できるuseFireRecovery(GameCharacter& a)を設定しません

};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

cout << "HP " << HP << "\n";

cout << "MP " << MP << "\n";

}





//👇🌞🌞🌞クラスGameCharacterを継承したクラスDragonです🌞🌞🌞


class Dragon:GameCharacter {

public:

void useFireRecovery(GameCharacter& a);


};



void Dragon::useFireRecovery(GameCharacter& a) {

cout << name << "は灼熱のフレアを" << a.name << "に吐いた !" << "\n";

cout << a.name << "は灼熱のフレアを受け燃え上がった!" << "\n";


a.HP += 10;


cout << a.name << "の体力は10回復した" << "\n";


}


int main() {


GameCharacter Lyliane;


Lyliane.name = "リリアーネ";

Lyliane.HP = 10;

Lyliane.MP = 8;


Dragon Pokky;

Pokky.name = "ポッキー";

Pokky.HP = 15;

Pokky.MP = 5;


Lyliane.statusDataDisplay();

Pokky.statusDataDisplay();


Pokky.useFireRecovery(Lyliane);


Lyliane.statusDataDisplay();

Pokky.statusDataDisplay();



return 0;

}


ビルド実行結果



エラー (アクティブ) E0265 関数 "GameCharacter::statusDataDisplay" (宣言された 行 19) にアクセスできません

エラー (アクティブ) E0265 関数 "GameCharacter::statusDataDisplay" (宣言された 行 19) にアクセスできません

エラー (アクティブ) E0265 メンバー "GameCharacter::name" (宣言された 行 9) にアクセスできません

エラー (アクティブ) E0265 メンバー "GameCharacter::MP" (宣言された 行 11) にアクセスできません

エラー (アクティブ) E0265 メンバー "GameCharacter::HP" (宣言された 行 10) にアクセスできません

エラー C2247 'GameCharacter::statusDataDisplay' はアクセスできません。'Dragon' は 'private' で 'GameCharacter' からの継承で使われています。

エラー C2247 'GameCharacter::statusDataDisplay' はアクセスできません。'Dragon' は 'private' で 'GameCharacter' からの継承で使われています。

エラー C2247 'GameCharacter::name' はアクセスできません。'Dragon' は 'private' で 'GameCharacter' からの継承で使われています。

エラー C2247 'GameCharacter::MP' はアクセスできません。'Dragon' は 'private' で 'GameCharacter' からの継承で使われています。

エラー C2247 'GameCharacter::HP' はアクセスできません。'Dragon' は 'private' で 'GameCharacter' からの継承で使われています。

~ ~ ~ ~ ~ ~ ~(´▽`*)~ ~ ~ ~ ~ ~ ~


マックス「


なんで


class Dragon:public GameCharacter

class Dragon:GameCharacter


と記述したらプログラムの実行ができない??」


てんC「不思議ですね。


明らかに


class Dragon:GameCharacter


と記述したときの方が


クラスの継承方法としては


簡潔でわかりやすいような気がします。


これはどういうことなのでしょうか?」



ソーラー「それをこれから調べていこうってわけなんだよ~。




🌞   🌞   🌞   🌞   🌞   🌞 

実は のちのエピソードで詳しく語られますが


class Dragon:GameCharacter


と記述した場合は


class Dragon:private GameCharacter



記述されていることになります


そして


その場合


親クラスGameCharacterのメンバ変数宣言


string name;

int HP;

int MP;


親クラスGameCharacterのメンバ関数宣言


void statusDataDisplay();




🌞子クラスDragonのクラス宣言内にんです🌞


引き継がれていない


ではなく


んです



今のプログラムでは


親クラスGameCharacterのメンバ変数宣言


string name;

int HP;

int MP;



親クラスGameCharacterのメンバ関数宣言


void statusDataDisplay();



子クラスDragonのクラス宣言内に引き継がれているのですが


Pokkyの子クラスDragon型のオブジェクト宣言


Dragon Pokky;



実行した後

Pokky.name = "ポッキー";

Pokky.HP = 15;

Pokky.MP = 5;

Pokky.statusDataDisplay();


を実行しようとしているので


ビルドエラーが表示されています


つまり


Pokkyの子クラスDragon型のオブジェクト宣言


Dragon Pokky;



実行しても


Pokky.name

Pokky.HP

Pokky.MP

Pokky.statusDataDisplay()

生成されていないのに




Pokky.name = "ポッキー";

Pokky.HP = 15;

Pokky.MP = 5;

Pokky.statusDataDisplay();


を実行しようとしているので


ビルドエラーが表示されることになります


もし


親クラスGameCharacterのメンバ変数宣言


string name;

int HP;

int MP;



親クラスGameCharacterのメンバ関数宣言


void statusDataDisplay();



子クラスDragonのクラス宣言内に引き継がれていない場合



main関数内に何もプログラムを記述していなくても


子クラスDragonのメンバ関数内で


親クラスGameCharacterのメンバ変数


name

HP

MP

が記述されているだけで


プログラムの実行時


ビルドエラーが表示されることになります

🌞   🌞   🌞   🌞   🌞   🌞




親クラスGameCharacter


から


子クラスDragon



クラスの継承を行う際


使用できるアクセス指定子は


puplic

protected

private

の3つあります。


つまり


親クラスGameCharacter


から


子クラスDragon



アクセス指定子を使って継承を行う方法は


class Dragon:public GameCharacter


class Dragon:protected GameCharacter


class Dragon:private GameCharacter



3通りの方法があるというわけです。」





  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る