アクセス指定子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

アクセスすることができているってわけだ」



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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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