アクセス指定子protectedは親クラスから子クラスへクラスの継承が行われるとき親クラスのメンバ変数宣言に設定されます
親クラスのメンバ変数にアクセスできるとはいったいどのようなことなのでしょうか? 再確認してみましょう
ソーラー「今日は以前学習した
アクセス指定子protectedさんの登場です
人気があるので再び登場していただきました
親クラスのメンバ変数
親クラスのメンバ関数
のアクセス指定子が
protectedに設定されていると
その
親クラスのメンバ変数
親クラスのメンバ関数
には
その親クラスからアクセスすることもできますし
その親クラスを継承した子クラスからアクセスすることもできます
が
main関数内や
継承関係にない他のクラスからアクセスすることはできません
このことを見聞きしている人はおおいいんじゃないかな?」
マックス「アクセス??
どういうことなのか・・・
アクセスできないってことは
main関数内や
継承関係にない他のクラス内で
その
親クラスのメンバ変数
親クラスのメンバ関数
を使用することはできないってことか?
ちょっとなんかわかりにくいんだが・・・」
ソーラー「そうなんです
確かに
親クラスのメンバ変数
親クラスのメンバ関数
に
💖アクセスできる💖
とは
ど~言う意味なのか
わかりにくいところだね
例えば
親クラスのメンバ変数宣言
親クラスのメンバ関数宣言
のアクセス指定子がpublicに設定されていると
親クラスのメンバ変数宣言
親クラスのメンバ関数宣言
は
子クラスのクラス宣言内に引き継がれることになります
ですので
親クラスのメンバ変数を
子クラスのメンバ関数の定義の中で
変数宣言をおこなうことなく用いることができるようになります
言い換えると
親クラスのメンバ変数を
子クラスのメンバ関数の定義の中で 直接、記述することができるようになります
このことを
子クラスのメンバ関数から親クラスのメンバ変数にアクセスできるといいます
それに対し
main関数内で
いきなり
そのまんま親クラスのメンバ変数をもちいたり
継承関係にない他のクラスのメンバ関数の定義内で
そのまんま親クラスのメンバ変数をもちいたりすることはできません
このことを
main関数内や
継承関係にない他のクラスから
親クラスのメンバ変数
親クラスのメンバ関数
に
🍋アクセスすることはできない🍋
といいます
それとは別に
main関数内で
子クラス型のオブジェクト宣言
を実行した場合
親クラスのメンバ変数宣言
親クラスのメンバ関数宣言
のアクセス指定子がpublicに設定されていると
子クラス型のオブジェクトの(親クラスから引き継いだ)メンバ変数
が生成され
main関数内で使用することができます
このことを
mainメソッド内から
子クラス型のオブジェクトの(親クラスから引き継いだ)メンバ変数
に
直接
💖アクセスできる💖
といいます
さらに
main関数内で
子クラス型のオブジェクトの(親クラスから引き継いだ)メンバ関数
や
子クラス型のオブジェクトの(子クラスに備わっている)メンバ関数
を記述できる
使用できることを
子クラス型のオブジェクトの(親クラスから引き継いだ)メンバ関数
や
子クラス型のオブジェクトの(子クラスに備わっている)メンバ関数
に
💖アクセスできる💖といいます
でも
この説明だけではわかりにくいかな?
具体的な例をみていこうよ
まずは次のプログラムをご覧ください」
👇
#include <iostream>
#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています
using namespace std;
//👇🌞🌞🌞親クラスGameCharacterです🌞🌞🌞
class GameCharacter {
public://👈🌞ここに注目してください🌞
string name="ポッキー";
int HP=10000;//👈テストモードのためHPを10000に設定しています
int MP=10000;//👈テストモードのためMPを10000に設定しています
public:
void statusDataDisplay();
};
void GameCharacter::statusDataDisplay() {
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP << "\n";
}
//👇🌞🌞🌞クラスGameCharacterを継承したクラスDragonです🌞🌞🌞
class Dragon :public GameCharacter {
public:
int DP = 10000;//👈テストモードのためDPを10000に設定しています
void statusDataDisplay2();
};
void Dragon::statusDataDisplay2() {
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP << "\n";
cout << "DP " << DP << "\n";
}
int main() {
Dragon Pokky;
Pokky.statusDataDisplay2();
return 0;
}
プログラムの実行結果
ポッキー
HP 10000
MP 10000
DP 10000
ソーラー「このプログラムでは
親クラスGameCharacterのメンバ変数宣言、初期化のアクセス指定子が
以下のように
publicに設定されています」
👇
public://👈🌞ここに注目してください🌞
string name="ポッキー";
int HP=10000;//👈テストモードのためHPを10000に設定しています
int MP=10000;//👈テストモードのためMPを10000に設定しています
ソーラー「この場合
親クラスGameCharacterのメンバ変数宣言のアクセス指定子が
publicに設定されているので
親クラスGameCharacterのメンバ変数
name
HP
MP
を
(基本の前提ですが 親クラスGameCharacterのメンバ関数の定義内では
親クラスGameCharacterのメンバ変数宣言のアクセス指定子が
public,private,protectedに関わらず使用することができます)
子クラスDragonのメンバ関数の定義内で
そのままもちいることができます
このことを
子クラスDragonのメンバ関数から
親クラスGameCharacterのメンバ変数
name
HP
MP
にアクセスできるといいます
が
main関数のブロック内
や
継承関係にない他のクラスの内部
や
そのクラスのメンバ関数の定義内で
そのまんま
親クラスGameCharacterのメンバ変数
name
HP
MP
を用いることはできません
このことを
main関数のブロック内
や
継承関係にない他のクラスの内部
や
そのクラスのメンバ関数から
🍋アクセスできない🍋
といいます
そうですね
たとえば・・・
簡単な例では
親クラスGameCharacterのメンバ変数
name
HP
MP
のアクセス指定子がpublicの場合
親クラスGameCharacterのメンバ変数
name
HP
MP
を
親クラスGameCharacterのメンバ関数
statusDataDisplay()の定義内で
記述、用いることができます
実際に親クラスGameCharacterのメンバ関数
statusDataDisplay()の定義をみてみると
👇
void GameCharacter::statusDataDisplay() {
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP << "\n";
}
親クラスGameCharacterのメンバ変数
name
HP
MP
が用いられているのがわかります
そのことを
親クラスGameCharacterのメンバ変数
name
HP
MP
に
親クラスGameCharacterのメンバ関数内から
💖アクセスできるといいます💖
main関数内で
PokkyのクラスDragon型のオブジェクト宣言
Dragon Pokky;
を行った際
直接
main関数内で
クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
を用いることができます
このことを
クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
に
main関数内から
💖アクセスできるといいます💖
もし
親クラスGameCharacterのメンバ変数宣言、初期化のアクセス指定子が
以下のように
privateに設定されていれば
👇
private://👈🌞ここに注目してください🌞
string name="ポッキー";
int HP=10000;//👈テストモードのためHPを10000に設定しています
int MP=10000;//👈テストモードのためMPを10000に設定しています
👆
親クラスGameCharacterのメンバ変数
name
HP
MP
は
親クラスGameCharacterのメンバ関数の定義内だけで使用することができます
子クラスのメンバ関数の定義内や
main関数のブロック内
継承関係にない他のクラスのメンバ関数の定義内で使用することはできません
そのことを
親クラスGameCharacterのメンバ変数
name
HP
MP
に
子クラスのメンバ関数の定義内や
main関数のブロック内
継承関係にない他のクラスのメンバ関数から
💖アクセスできない💖
といいます」
そのことを示すプログラムはこちらです
👇
#include <iostream>
#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています
using namespace std;
//👇🌞🌞🌞クラスGameCharacterです🌞🌞🌞
class GameCharacter {
private://👈🌞ここに注目!してください🌞
string name="ポッキー";
int HP=10000;//👈テストモードのためHPを10000に設定しています
int MP=10000;//👈テストモードのためMPを10000に設定しています
public:
void statusDataDisplay();
};
void GameCharacter::statusDataDisplay() {
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP << "\n";
}
//👇🌞🌞🌞クラスGameCharacterを継承したクラスDragonです🌞🌞🌞
class Dragon :public GameCharacter {
public:
int DP =10000;
void statusDataDisplay2();
};
void Dragon::statusDataDisplay2() {
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP << "\n";
cout << "DP " << DP << "\n";
}
/*👆👆👆🌞🌞🌞🌞🌞
親クラスGameCharacterのメンバ変数
name
HP
MP
のアクセス指定子が
privateに設定されているので
子クラスDragon(のメンバ関数)内で
親クラスGameCharacterのメンバ変数
name
HP
MP
を
記述、使用することはできません
つまり
子クラスDragon(のメンバ関数)内から
親クラスGameCharacterのメンバ変数
name
HP
MP
にアクセスできません
この場合
子クラスDragonのメンバ関数statusDataDisplay2()内で
親クラスGameCharacterのメンバ変数
name
HP
MP
が記述されていますが
それだけで
プログラムを実行したときビルドエラーが表示されることになります
🌞🌞🌞🌞🌞*/
int main() {
Dragon Pokky;
Pokky.name="キットポッキー";
Pokky.HP = 10;
Pokky.MP = 10;
/*👆👆👆🌞🌞🌞🌞🌞
親クラスGameCharacterのメンバ変数
name
HP
MP
のアクセス指定子が
privateに設定されているので
main関数内で
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
を使用することはできません
このことを
main関数内から
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MPにアクセスできないといいます🌞🌞🌞🌞🌞*/
Pokky.statusDataDisplay2();
return 0;
}
プログラムの実行結果
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー (アクティブ) E0265 メンバー "GameCharacter::name" (宣言された 行 9) にアクセスできません
エラー (アクティブ) E0265 メンバー "GameCharacter::name" (宣言された 行 9) にアクセスできません
エラー (アクティブ) E0265 メンバー "GameCharacter::MP" (宣言された 行 11) にアクセスできません
エラー (アクティブ) E0265 メンバー "GameCharacter::MP" (宣言された 行 11) にアクセスできません
エラー (アクティブ) E0265 メンバー "GameCharacter::HP" (宣言された 行 10) にアクセスできません
エラー (アクティブ) E0265 メンバー "GameCharacter::HP" (宣言された 行 10) にアクセスできません
エラー 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' で宣言されている) にアクセスできません。
ソーラー「ビルドエラーの前半部分
エラー (アクティブ) E0265 メンバー "GameCharacter::name" (宣言された 行 9) にアクセスできません
エラー (アクティブ) E0265 メンバー "GameCharacter::name" (宣言された 行 9) にアクセスできません
エラー (アクティブ) E0265 メンバー "GameCharacter::MP" (宣言された 行 11) にアクセスできません
エラー (アクティブ) E0265 メンバー "GameCharacter::MP" (宣言された 行 11) にアクセスできません
エラー (アクティブ) E0265 メンバー "GameCharacter::HP" (宣言された 行 10) にアクセスできません
エラー (アクティブ) E0265 メンバー "GameCharacter::HP" (宣言された 行 10) にアクセスできません
は
親クラスGameCharacterのメンバ変数
name
HP
MP
のアクセス指定子が
privateに設定されているのに
子クラスDragon(のメンバ関数)内で
親クラスGameCharacterのメンバ変数
name
HP
MP
を
記述、使用しているので
表示されています
ビルドエラーの後半部分
エラー 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' で宣言されている) にアクセスできません。
は
親クラスGameCharacterのメンバ変数
name
HP
MP
のアクセス指定子が
privateに設定されているのに
main関数内で
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
を使用しているので
そのようなことはできませんよ
と表示されています
親クラスGameCharacterのメンバ変数
name
HP
MP
のアクセス指定子が
privateに設定されているので
Pokkyの子クラスDragon型のオブジェクト
Dragon Pokky;
を実行しても
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
は生成されていないんだね」
マックス「
main関数内で
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
を使用できれば
main関数内から
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
に
アクセスすることができているってわけだ」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます