🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
親クラスのメンバ変数宣言のアクセス指定子がprivateの場合は子クラスのクラス宣言内に親クラスのメンバ変数宣言は引き継がれません
親クラスのメンバ変数宣言のアクセス指定子が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
に格納されている値を変更することができています
このプログラムのように
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「はい
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「分かってきたかも💖」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます