親クラスのメンバ変数宣言のアクセス指定子がprivateの場合は子クラスのクラス宣言内に親クラスのメンバ変数宣言は引き継がれません

つづきです😊


ソーラー「さあ いよいよです


はたして


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


string name;

int HP;

int MP;



アクセス指定子protected


を設定した場合と


アクセス指定子public


アクセス指定子private


に設定した場合の違いは どうなっているのかな



早速 考察してみよう~



まずは




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


string name;

int HP;

int MP;


のアクセス指定子が


public


子クラスDragonに備わっているメンバ変数宣言


int DP ;


のアクセス指定子が


public

に設定されている場合を考察してみたいと思います


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


string name;

int HP;

int MP;


のアクセス指定子が


public


に設定されている場合


子クラスDragonのクラス宣言内に


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


string name;

int HP;

int MP;


は引き継がれることになります


この状態で



        main関数内で


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


Dragon Pokky;


をおこなって


子クラスDragon型のオブジェクトPokkyを作製した場合


子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.name

Pokky.HP

Pokky.MP


子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.DP


が生成されることになります


そして


          🌞main関数内で🌞


           🌞直接🌞



子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.name

Pokky.HP

Pokky.MP


子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.DP


を用いて



Pokky.name = "ポッキー";

Pokky.HP = 20;

Pokky.MP = 3;

Pokky.DP = 2;



のように



子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.name

Pokky.HP

Pokky.MP


子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.DP


に格納されているデータを変更することができます


そしてさらに



子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.name

Pokky.HP

Pokky.MP


子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.DP


に格納されているデータ



子クラスDragon型のオブジェクトPokkyのメンバ関数


Pokky.setDragonStatusData("みゃっぴー", 5, 6, 7)


によって


変更することもできます



その様子を示すプログラムをご覧ください

👇


#include <iostream>

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

using namespace std;


class GameCharacter {


public:

string name;

int HP;

int MP;


void statusDataDisplay();


};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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


}




class Dragon:public GameCharacter {

public:


int DP;//👈ドラゴン型のキャラクターだけに備わっているドラゴンポイントです

void setDragonStatusData(string a, int b, int c, int d);

void DragonstatusDataDisplay();

};



//👇🌞🌞🌞クラスDragonのメンバ関数setDragonStatusData(string a, int b, int c, int d) の定義です🌞🌞🌞

void Dragon::setDragonStatusData(string a, int b, int c, int d) {


name = a;

HP = b;

MP = c;

DP = d;


}


//👇🌞🌞🌞クラスDragonのメンバ関数DragonstatusDataDisplay()の定義です🌞🌞🌞

void Dragon::DragonstatusDataDisplay() {


cout << name << "\n";

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

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

cout << "DP " << DP << "\n";


}




int main() {



Dragon Pokky;


Pokky.name = "ポッキー";

Pokky.HP = 20;

Pokky.MP = 3;

Pokky.DP = 2;

//🌞👆子クラスDragon型のオブジェクトPokkyのメンバ変数に直接データを代入しています

Pokky.DragonstatusDataDisplay();


Pokky.setDragonStatusData("みゃっぴー", 5, 6, 7);


Pokky.DragonstatusDataDisplay();


return 0;

}



プログラムの実行結果



ポッキー

HP 20

MP 3

DP 2

みゃっぴー

HP 5

MP 6

DP 7



てんC「


          🌞main関数内で🌞


           🌞直接🌞



子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.name

Pokky.HP

Pokky.MP


子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.DP


を用いて



Pokky.name = "ポッキー";

Pokky.HP = 20;

Pokky.MP = 3;

Pokky.DP = 2;



のように



子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.name

Pokky.HP

Pokky.MP


子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.DP


にデータを代入することができています


Pokky.setDragonStatusData("みゃっぴー", 5, 6, 7);


を実行することにより


子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.name

Pokky.HP

Pokky.MP


子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.DP


に格納されている値を変更することができています


このプログラムのように


親クラスGameCharacter💖💖💖💖💖💖💖💖💖💖💖💖のメンバ変数

name

HP

MP


アクセス指定子が

public

の場合




子クラスDragon型のオブジェクトPokkyのメンバ関数を用いて



子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.name

Pokky.HP

Pokky.MP

格納されているデータを変更することができます


そして加えて



子クラスDragonのメンバ変数

DPの

アクセス指定子が

public


に設定されている場合


子クラスDragon型のオブジェクトPokkyのメンバ関数を通して


子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.DP


格納されているデータを変更することができます




次に



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


string name;

int HP;

int MP;


アクセス指定子が


           🌞private🌞





子クラスDragonのメンバ変数宣言


int DP;

アクセス指定子が

public



設定されている場合はいかがでしょうか?


この場合


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


string name;

int HP;

int MP;



子クラスDragonのクラス宣言内に引き継がれません


ですので


子クラスDragonのメンバ関数setDragonStatusData(string a, int b, int c, int d)の定義


および


子クラスDragonのメンバ関数DragonstatusDataDisplay()の定義


内で


親クラスGameCharacterのメンバ変数


name

HP

MP


を用いることはできません


以下のように


子クラスDragonのメンバ関数setDragonstatusData(string a, int b, int c, int d)の定義


および


子クラスDragonのメンバ関数DragonstatusDataDisplay()の定義内で


親クラスGameCharacterのメンバ変数


name

HP

MP


を用いていると


👇



//👇🌞🌞🌞クラスDragonのメンバ関数setDragonStatusData(string a, int b, int c, int d) の定義です🌞🌞🌞

void Dragon::setDragonStatusData(string a, int b, int c, int d) {


name = a;

HP = b;

MP = c;

DP = d;


}


//👇🌞🌞🌞クラスDragonのメンバ関数DragonstatusDataDisplay()の定義です🌞🌞🌞

void Dragon::DragonstatusDataDisplay() {


cout << name << "\n";

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

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

cout << "DP " << DP << "\n";


}


👆


それだけでプログラムの実行時ビルドエラーが表示されることになります


そのことを示すプログラムはこちらです


👇

#include <iostream>

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

using namespace std;


class GameCharacter {


private://🌞ここに注目

string name;

int HP;

int MP;

public:

void statusDataDisplay();


};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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


}




class Dragon :public GameCharacter {

public:


int DP;//👈ドラゴン型のキャラクターだけに備わっているドラゴンポイントです


public:

void setDragonStatusData(string a, int b, int c, int d);

void DragonstatusDataDisplay();

};



//👇🌞🌞🌞クラスDragonのメンバ関数setStatusData()の定義です🌞🌞🌞

void Dragon::setDragonStatusData(string a, int b, int c, int d) {


name = a;

HP = b;

MP = c;

DP = d;


}


//👇🌞🌞🌞クラスDragonのメンバ関数DragonstatusDataDisplay()の定義です🌞🌞🌞

void Dragon::DragonstatusDataDisplay() {


cout << name << "\n";

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

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

cout << "DP " << DP << "\n";


}




int main() {



return 0;



}


プログラムの実行結果



重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態

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

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

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

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

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

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

エラー C2248 'GameCharacter::name': private メンバー (クラス 'GameCharacter' で宣言されている) にアクセスできません。

エラー C2248 'GameCharacter::name': private メンバー (クラス 'GameCharacter' で宣言されている) にアクセスできません。

エラー C2248 'GameCharacter::MP': private メンバー (クラス 'GameCharacter' で宣言されている) にアクセスできません。

エラー C2248 'GameCharacter::MP': private メンバー (クラス 'GameCharacter' で宣言されている) にアクセスできません。

エラー C2248 'GameCharacter::HP': private メンバー (クラス 'GameCharacter' で宣言されている) にアクセスできません。

エラー C2248 'GameCharacter::HP': private メンバー (クラス 'GameCharacter' で宣言されている) にアクセスできません。

エラー MSB6006 "CL.exe" はコード 2 を伴って終了しました。 C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets 360


てんC「ですので


もちろん


main関数内で


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


Dragon Pokky;


を行って


子クラスDragon型のオブジェクトPokkyを作製し


子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.name

Pokky.HP

Pokky.MP


を生成し


main関数内で


直接


Pokky.name

Pokky.HP

Pokky.MP


を使用するなどということはできません」





マックス「なるほどな」



てんC「



では





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


string name;

int HP;

int MP;


のアクセス指定子が


            protected


子クラスDragonに備わっているメンバ変数宣言


int DP ;


のアクセス指定子が


public

に設定されている場合を考察してみたいと思います


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


string name;

int HP;

int MP;


のアクセス指定子が


protected


に設定されている場合でも


子クラスDragonのクラス宣言内に


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


string name;

int HP;

int MP;


は引き継がれることになります



ですので


子クラスDragonのメンバ関数setDragonStatusData(string a, int b, int c, int d)の定義

子クラスDragonのメンバ関数DragonstatusDataDisplay()の定義


内で


親クラスGameCharacterのメンバ変数


name

HP

MP


を用いることができます





以下のように


子クラスDragonのメンバ関数setDragonStatusData(string a, int b, int c, int d)の定義

子クラスDragonのメンバ関数DragonstatusDataDisplay()の定義


内で


親クラスGameCharacterのメンバ変数


name

HP

MP


を用いることができるというわけです


👇



//👇🌞🌞🌞クラスDragonのメンバ関数setDragonStatusData(string a, int b, int c, int d) の定義です🌞🌞🌞

void Dragon::setDragonStatusData(string a, int b, int c, int d) {


name = a;

HP = b;

MP = c;

DP = d;


}


//👇🌞🌞🌞クラスDragonのメンバ関数DragonstatusDataDisplay()の定義です🌞🌞🌞

void Dragon::DragonstatusDataDisplay() {


cout << name << "\n";

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

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

cout << "DP " << DP << "\n";


}


👆


もちろん


プログラムの実行時にビルドエラーが表示されることはありません


そのことを示すプログラムはこちらです






#include <iostream>

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

using namespace std;


class GameCharacter {


protected://🌞ここに注目

string name;

int HP;

int MP;

public:

void statusDataDisplay();


};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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


}




class Dragon :public GameCharacter {

public:


int DP;//👈ドラゴン型のキャラクターだけに備わっているドラゴンポイントです


public:

void setDragonStatusData(string a, int b, int c, int d);

void DragonstatusDataDisplay();

};



//👇🌞🌞🌞クラスDragonのメンバ関数setStatusData()の定義です🌞🌞🌞

void Dragon::setDragonStatusData(string a, int b, int c, int d) {


name = a;

HP = b;

MP = c;

DP = d;


}


//👇🌞🌞🌞クラスDragonのメンバ関数DragonstatusDataDisplay()の定義です🌞🌞🌞

void Dragon::DragonstatusDataDisplay() {


cout << name << "\n";

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

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

cout << "DP " << DP << "\n";


}




int main() {



return 0;



}



プログラムの実行結果


何も表示されませんがプログラムの実行に成功しています



てんC「そう


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


string name;

int HP;

int MP;


のアクセス指定子が


publicに設定されているときと同様に


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


string name;

int HP;

int MP;


のアクセス指定子が


protected


に設定されている場合でも


子クラスDragonのクラス宣言内に


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


string name;

int HP;

int MP;



        



ですので


子クラスDragonのメンバ関数setDragonStatusData(string a, int b, int c, int d)の定義

子クラスDragonのメンバ関数DragonstatusDataDisplay()の定義


内で


親クラスGameCharacterのメンバ変数


name

HP

MP


を用いることができます」



マックス「??


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


string name;

int HP;

int MP;


のアクセス指定子が


public


に設定されている場合でも


protected


に設定されている場合でも


子クラスDragonのクラス宣言内に


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


string name;

int HP;

int MP;



        


るのか・・・


じゃあ


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


string name;

int HP;

int MP;


のアクセス指定子が


publicに設定されている場合と


protectedに設定されている場合の違いとはなんなんだ?」




てんC「はい


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


string name;

int HP;

int MP;


のアクセス指定子が


protectedに設定されている場合で



        main関数内でも


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


Dragon Pokky;


をおこなって


子クラスDragon型のオブジェクトPokkyを作製した場合


子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.name

Pokky.HP

Pokky.MP


子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.DP


が生成されることになります


ですが


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


string name;

int HP;

int MP;


のアクセス指定子が


publicに設定されている場合と違い


protectedに設定されている場合は




          🌞main関数内で🌞


           🌞直接🌞



子クラスDragon型のオブジェクトPokkyの(親クラスから継承した)メンバ変数


Pokky.name

Pokky.HP

Pokky.MP



を用いて



Pokky.name = "ポッキー";

Pokky.HP = 20;

Pokky.MP = 3;



のように



子クラスDragon型のオブジェクトPokkyの(親クラスから継承した)メンバ変数


Pokky.name

Pokky.HP

Pokky.MP


に格納されているデータを変更することはできません」


マックス「ここで


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


string name;

int HP;

int MP;


のアクセス指定子が


publicに設定されている場合



protectedに設定されている場合のちがいがでてきたか」



てんC「はい


もう1度繰り返すと


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


string name;

int HP;

int MP;


のアクセス指定子が



protectedに設定されている場合は


          🌞main関数内で🌞


           🌞直接🌞



子クラスDragon型のオブジェクトPokkyの(親クラスから継承した)メンバ変数


Pokky.name

Pokky.HP

Pokky.MP



を用いて



Pokky.name = "ポッキー";

Pokky.HP = 20;

Pokky.MP = 3;



のように



子クラスDragon型のオブジェクトPokkyの(親クラスから継承した)メンバ変数


Pokky.name

Pokky.HP

Pokky.MP


に格納されているデータを変更することはできません」


そのことを示すプログラムはこちらです

👇

#include <iostream>

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

using namespace std;


class GameCharacter {


protected:

string name;

int HP;

int MP;


public:

void statusDataDisplay();


};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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


}




class Dragon :public GameCharacter {

public:


int DP;//👈ドラゴン型のキャラクターだけに備わっているドラゴンポイントです

void setDragonStatusData(string a, int b, int c, int d);

void DragonstatusDataDisplay();

};



//👇🌞🌞🌞クラスDragonのメンバ関数setDragonStatusData(string a, int b, int c, int d) の定義です🌞🌞🌞

void Dragon::setDragonStatusData(string a, int b, int c, int d) {


name = a;

HP = b;

MP = c;

DP = d;


}


//👇🌞🌞🌞クラスDragonのメンバ関数DragonstatusDataDisplay()の定義です🌞🌞🌞

void Dragon::DragonstatusDataDisplay() {


cout << name << "\n";

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

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

cout << "DP " << DP << "\n";


}




int main() {



Dragon Pokky;


Pokky.name = "ポッキー";

Pokky.HP = 20;

Pokky.MP = 3;

Pokky.DP = 2;

//🌞👆子クラスDragon型のオブジェクトPokkyのメンバ変数に直接データを代入していますが、このようなことはできません

return 0;

}


プログラムの実行結果


重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態

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

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

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

エラー C2248 'GameCharacter::name': protected メンバー (クラス 'GameCharacter' で宣言されている) にアクセスできません。

エラー C2248 'GameCharacter::MP': protected メンバー (クラス 'GameCharacter' で宣言されている) にアクセスできません。 エラー C2248 'GameCharacter::HP': protected メンバー (クラス 'GameCharacter' で宣言されている) にアクセスできません。




てんC「ですが


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


string name;

int HP;

int MP;


のアクセス指定子が


protectedに設定されている場合




子クラスDragon型のオブジェクトPokkyのメンバ変数

Pokky.name

Pokky.HP

Pokky.MP

(Pokky.DP)



子クラスDragon型のオブジェクトPokkyのメンバ関数


Pokky.setDragonStatusData("みゃっぴー", 5, 6, 7)


を実行することによって


みゃっぴー

5

6

(7)



代入することはできます



その様子を示すプログラムをご覧ください

👇


#include <iostream>

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

using namespace std;


class GameCharacter {


protected:

string name;

int HP;

int MP;


void statusDataDisplay();


};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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


}




class Dragon :public GameCharacter {

public:


int DP;//👈ドラゴン型のキャラクターだけに備わっているドラゴンポイントです

void setDragonStatusData(string a, int b, int c, int d);

void DragonstatusDataDisplay();

};



//👇🌞🌞🌞クラスDragonのメンバ関数setDragonStatusData(string a, int b, int c, int d) の定義です🌞🌞🌞

void Dragon::setDragonStatusData(string a, int b, int c, int d) {


name = a;

HP = b;

MP = c;

DP = d;


}


//👇🌞🌞🌞クラスDragonのメンバ関数DragonstatusDataDisplay()の定義です🌞🌞🌞

void Dragon::DragonstatusDataDisplay() {


cout << name << "\n";

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

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

cout << "DP " << DP << "\n";


}




int main() {



Dragon Pokky;



//🌞👆子クラスDragon型のオブジェクトPokkyのメンバ変数に直接データを代入しています

Pokky.DragonstatusDataDisplay();


Pokky.setDragonStatusData("みゃっぴー", 5, 6, 7);


Pokky.DragonstatusDataDisplay();


return 0;

}


プログラムの実行結果




HP -858993460

MP -858993460

DP -858993460

みゃっぴー

HP 5

MP 6

DP 7



てんC「


          🌞main関数内で🌞


           🌞直接🌞



子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.name

Pokky.HP

Pokky.MP



を用いて



Pokky.name = "ポッキー";

Pokky.HP = 20;

Pokky.MP = 3;



のように



子クラスDragon型のオブジェクトPokkyのメンバ変数

Pokky.name

Pokky.HP

Pokky.MP



に格納されているデータを代入、初期化することができませんが




子クラスDragon型のオブジェクトPokkyのメンバ関数


Pokky.setDragonStatusData("みゃっぴー", 5, 6, 7)


を実行することによって


子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.name

Pokky.HP

Pokky.MP

(Pokky.DP)



データ


みゃっぴー

5

6

(7)



代入することができていますね



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


string name;

int HP;

int MP;


のアクセス指定子が


publicに設定されている場合も


子クラスDragon型のオブジェクトPokkyのメンバ関数


Pokky.setDragonStatusData("みゃっぴー", 5, 6, 7)


を実行することによって


子クラスDragon型のオブジェクトPokkyのメンバ変数

Pokky.name

Pokky.HP

Pokky.MP

(Pokky.DP)



データ


みゃっぴー

5

6

(7)



代入することができますが


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


string name;

int HP;

int MP;


のアクセス指定子が


privateに設定されている場合は


そもそも


プログラムを実行することができません


以上が


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


string name;

int HP;

int MP;


のアクセス指定子が


public

private

protected


に設定されている場合の違いです」




























マックス「ほうほう


もうちょっと雑談としようか」



てんC「はい



親クラスGameCharacter💖💖💖💖💖💖💖💖💖💖💖💖のメンバ変数

name

HP

MP


アクセス指定子が

public

の場合




子クラスDragon型のオブジェクトPokkyのメンバ関数を用いて



子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.name

Pokky.HP

Pokky.MP

格納されているデータを変更することができます


そして加えて



子クラスDragonのメンバ変数

DPの

アクセス指定子が

public


に設定されている場合


子クラスDragon型のオブジェクトPokkyのメンバ関数を通して


子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.DP


格納されているデータを変更することができます




次に



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


string name;

int HP;

int MP;


アクセス指定子が


           🌞private🌞





子クラスDragonのメンバ変数宣言


int DP;の

アクセス指定子が

public



設定されている場合はいかがでしょうか?


この場合


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


string name;

int HP;

int MP;



子クラスDragonのクラス宣言内に引き継がれません


ですので


子クラスDragonのメンバ関数setDragonStatusData(string a, int b, int c, int d)の定義



子クラスDragonのメンバ関数DragonstatusDataDisplay()の定義


内で


親クラスGameCharacterのメンバ変数


name

HP

MP


を用いることはできません


以下のように


子クラスDragonのメンバ関数setDragonStatusData(string a, int b, int c, int d)の定義



子クラスDragonのメンバ関数DragonstatusDataDisplay()の定義


内で


親クラスGameCharacterのメンバ変数


name

HP

MP


を用いていると


👇



//👇🌞🌞🌞クラスDragonのメンバ関数setDragonStatusData(string a, int b, int c, int d) の定義です🌞🌞🌞

void Dragon::setDragonStatusData(string a, int b, int c, int d) {


name = a;

HP = b;

MP = c;

DP = d;


}


//👇🌞🌞🌞クラスDragonのメンバ関数DragonstatusDataDisplay()の定義です🌞🌞🌞

void Dragon::DragonstatusDataDisplay() {


cout << name << "\n";

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

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

cout << "DP " << DP << "\n";


}


👆


それだけでプログラムの実行時ビルドエラーが表示されることになります


そのことを示すプログラムはこちらです



👇

#include <iostream>

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

using namespace std;


class GameCharacter {


private://🌞ここに注目

string name;

int HP;

int MP;

public:

void statusDataDisplay();


};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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


}




class Dragon :public GameCharacter {

public:


int DP;//👈ドラゴン型のキャラクターだけに備わっているドラゴンポイントです


public:

void setDragonStatusData(string a, int b, int c, int d);

void DragonstatusDataDisplay();

};



//👇🌞🌞🌞クラスDragonのメンバ関数setStatusData()の定義です🌞🌞🌞

void Dragon::setDragonStatusData(string a, int b, int c, int d) {


name = a;

HP = b;

MP = c;

DP = d;


}


//👇🌞🌞🌞クラスDragonのメンバ関数DragonstatusDataDisplay()の定義です🌞🌞🌞

void Dragon::DragonstatusDataDisplay() {


cout << name << "\n";

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

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

cout << "DP " << DP << "\n";


}




int main() {



return 0;

}


プログラムの実行結果



重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態

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

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

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

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

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

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

エラー C2248 'GameCharacter::name': private メンバー (クラス 'GameCharacter' で宣言されている) にアクセスできません。

エラー C2248 'GameCharacter::name': private メンバー (クラス 'GameCharacter' で宣言されている) にアクセスできません。

エラー C2248 'GameCharacter::MP': private メンバー (クラス 'GameCharacter' で宣言されている) にアクセスできません。

エラー C2248 'GameCharacter::MP': private メンバー (クラス 'GameCharacter' で宣言されている) にアクセスできません。

エラー C2248 'GameCharacter::HP': private メンバー (クラス 'GameCharacter' で宣言されている) にアクセスできません。

エラー C2248 'GameCharacter::HP': private メンバー (クラス 'GameCharacter' で宣言されている) にアクセスできません。

エラー MSB6006 "CL.exe" はコード 2 を伴って終了しました。 C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\VCTargets\Microsoft.CppCommon.targets 360


てんC「ですので


もちろん


main関数内で


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


Dragon Pokky;


を行って


子クラスDragon型のオブジェクトPokkyを作製し


子クラスDragon型のオブジェクトPokkyのメンバ変数


Pokky.name

Pokky.HP

Pokky.MP


を生成し


main関数内で


直接


Pokky.name

Pokky.HP

Pokky.MP


を使用するなどということはできません」





マックス「なるほどな」


solarplexuss「分かってきたかも💖」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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