アクセス指定子を用いたクラスの継承では🌞親クラスのメンバ変数、メンバ関数宣言のアクセス指定子は🌞クラスの継承のときにもちいる優先度の高いアクセス指定子で🌞置き換えられるというシステム🌞になっています


ソーラー「ここで


さきほどのエピソードをおさらいしてみましょう」



ソーラー「



🌞🌞🌞親クラスGameCharacterのクラス宣言が🌞🌞🌞

👇

class GameCharacter {


public://👈ここに注目 アクセス指定子がpublicに設定されています

string name;

int HP;

int MP;


void statusDataDisplay();


};

👆

のように設定されているとします


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


string name;

int HP;

int MP;


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


void statusDataDisplay();


のアクセス指定子は


             🌞public🌞



 に設定されています


            この状態で


親クラスGameCharacter

から

子クラスDragon へ


クラスの継承を


    🌞🌞アクセス指定子publicを用いて行った場合🌞🌞

👇

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

string name;

int HP;

int MP;


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


void statusDataDisplay();

👆




      🌞🌞アクセス指定子public🌞🌞


が付けられた状態の

👇

public:

//👆🌞🌞🌞アクセス指定子publicが設定されていることに大注目🌞🌞🌞

string name;

int HP;

int MP;


void statusDataDisplay();

👆

として


子クラスDragon に引き継がれます


親クラスGameCharacter

から

子クラスDragon へ


クラスの継承を


    🌞🌞アクセス指定子publicを用いて行った場合🌞🌞



🌞🌞🌞クラスGameCharacterを継承した子クラスDragonのクラス宣言🌞🌞🌞は以下のようになります

👇

class Dragon:public GameCharacter {

public:

void statusDataDisplay2(string a, int b, int c);


};


👆


この親クラスGameCharacterを継承した子クラスDragonのクラス宣言には

見えていないだけで


アクセス指定子publicが付けられた状態で


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

string name;

int HP;

int MP;


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


void statusDataDisplay();



ちゃんと引き継がれています


例えば


次のような感じです


class Dragon:public GameCharacter {


public//🌞🌞🌞アクセス指定子publicが設定されていることに大注目🌞🌞🌞

string name;

int HP;

int MP;


void statusDataDisplay();


public:

void statusDataDisplay2(string a, int b, int c);


};


次に


親クラスGameCharacter

から

子クラスDragon へ


クラスの継承をアクセス指定子protectedを用いて行ったとします


その際



🌞🌞🌞クラスGameCharacterを継承した子クラスDragonのクラス宣言🌞🌞🌞は以下のようになります

👇

class Dragon:protected GameCharacter {

public:

void statusDataDisplay2(string a, int b, int c);


};



このクラスGameCharacterを継承した子クラスDragonのクラス宣言には

見えていないだけで


アクセス指定子protectedが付けられた状態で


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


string name;

int HP;

int MP;


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


void statusDataDisplay();


が引き継がれています


例えば


次のような感じです

👇

class Dragon:protected GameCharacter {


protected://🌞🌞🌞アクセス指定子protectedが設定されていることに大注目🌞🌞🌞

string name;

int HP;

int MP;


void statusDataDisplay();


public:

void statusDataDisplay2(string a, int b, int c);


};


子クラスDragonのクラス宣言が

このように

👇


class Dragon:private GameCharacter {


private://🌞🌞🌞アクセス指定子protectedが設定されていることに大注目🌞🌞🌞

string name;

int HP;

int MP;


void statusDataDisplay();


public://🌞🌞🌞もちろんアクセス指定子publicが書き換わるということはありません🌞🌞🌞

void statusDataDisplay2(string a, int b, int c);


};

設定されていると


子クラスDragonのメンバ変数となった親クラスGameCharacterのメンバ変数


name

HP

MP

には


子クラスDragon(のメンバ関数)内からアクセスすることができます




👇

子クラスDragonのメンバ変数となった親クラスGameCharacterのメンバ変数


name


👇

子クラスDragonのメンバ変数となった親クラスGameCharacterのメンバ変数


HP

MP

には


子クラスDragon(のメンバ関数)内からアクセスすることができます

👆


の意味が分かりにくいかな?


意味は


子クラスDragonのメンバ変数となった親クラスGameCharacterのメンバ変数


name

HP

MP


子クラスDragonのメンバ関数内で記述することができる



子クラスDragonのメンバ関数内で使用することができる


です


さらに


main関数内で


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


Dragon Pokky;


を実行しても 


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


Pokky.name

Pokky.HP

Pokky.MP


は生成されないので


main関数内で


直接


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


Pokky.name

Pokky.HP

Pokky.MP

を用いて


Pokky.name="ポッキー";

Pokky.HP=10;

Pokky.MP=5;


のように


データを代入することはできませんが


子クラスDragonのメンバ関数


Pokky.statusDataDisplay2(string a, int b, int c)


のアクセス指定子はpublicに設定されているので


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


Pokky.statusDataDisplay2(string a, int b, int c)は生成されることになります


ですので


Pokky.statusDataDisplay2("ポッキー", 10, 5);



を実行することにより



間接的に


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


Pokky.name

Pokky.HP

Pokky.MP


"ポッキー"

10

5


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





次に


親クラスGameCharacter

から

子クラスDragon へ


クラスの継承を


    🌞🌞アクセス指定子privateを用いて行った場合🌞🌞


👇

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


string name;

int HP;

int MP;


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


void statusDataDisplay();

👆




      🌞🌞アクセス指定子private🌞🌞


が付けられた状態の

👇

private://🌞🌞🌞アクセス指定子privateが設定されていることに大注目🌞🌞🌞

string name;

int HP;

int MP;


void statusDataDisplay();

👆

として


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


例えば


次のような感じです

👇

class Dragon:private GameCharacter {


private://🌞🌞🌞アクセス指定子protectedが設定されていることに大注目🌞🌞🌞

string name;

int HP;

int MP;


void statusDataDisplay();


public://🌞🌞🌞もちろんアクセス指定子publicが書き換わるということはありません🌞🌞🌞

void statusDataDisplay2(string a, int b, int c);


};



マックス「おお、そ~なるのか」


ソーラー「

子クラスDragonのクラス宣言が

このように

👇


class Dragon:private GameCharacter {


private://🌞🌞🌞アクセス指定子protectedが設定されていることに大注目🌞🌞🌞

string name;

int HP;

int MP;


void statusDataDisplay();


public://🌞🌞🌞もちろんアクセス指定子publicが書き換わるということはありません🌞🌞🌞

void statusDataDisplay2(string a, int b, int c);


}

設定されていると


子クラスDragonのメンバ変数となった親クラスGameCharacterのメンバ変数


name

HP

MP

には


子クラスDragon(のメンバ関数)内からアクセスすることができます




👇

子クラスDragonのメンバ変数となった親クラスGameCharacterのメンバ変数


name

HP

MP

には


子クラスDragon(のメンバ関数)内からアクセスすることができます

👆


の意味が分かりにくいかな?


意味は


子クラスDragonのメンバ変数となった親クラスGameCharacterのメンバ変数


name

HP

MP


子クラスDragonのメンバ関数内で記述することができる


です


さらに


main関数内で


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


Dragon Pokky;


を実行しても 


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


Pokky.name

Pokky.HP

Pokky.MP


は生成されないので


main関数内で


直接


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


Pokky.name

Pokky.HP

Pokky.MP

を用いて


Pokky.name="ポッキー";

Pokky.HP=10;

Pokky.MP=5;


のように


データを代入することはできませんが


子クラスDragonのメンバ関数


Pokky.statusDataDisplay2(string a, int b, int c)


のアクセス指定子はpublicに設定されているので


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


Pokky.statusDataDisplay2(string a, int b, int c)は生成されることになります


ですので


Pokky.statusDataDisplay2("ポッキー", 10, 5);



を実行することにより



間接的に


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


Pokky.name

Pokky.HP

Pokky.MP


"ポッキー"

10

5


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





マックス「おお これが


      🍎アクセス指定子privateをもちいて🍎


        class Dragon:private GameCharacterのように


         クラスの継承を行った場合と



   

      🍊アクセス指定子protectedをもちいて🍊


        class Dragon:protected GameCharacterのように


          クラスの継承を行った場合




の違いってわけかあ😊



って 


まったく違いはないじゃないか」



ソーラー「そうなんです


違いはないんです」




マックス「なんか違いはないのか?



・・・



あっ そうだ


            





いまのは


🌞🌞🌞親クラスGameCharacterのクラス宣言が🌞🌞🌞

👇

class GameCharacter {


public://👈ここに注目 アクセス指定子がpublicに設定されています

string name;

int HP;

int MP;


void statusDataDisplay();


};

👆

のように設定されている


つまり


親クラスGameCharacterのメンバ変数


string name;

int HP;

int MP;

親クラスGameCharacterのメンバ関数

void statusDataDisplay();


のアクセス指定子が


             🌞public🌞



 に設定されている場合だろう( ̄▽ ̄)



なら


🌞🌞🌞親クラスGameCharacterのクラス宣言が🌞🌞🌞

👇

class GameCharacter {


private://👈ここに注目 アクセス指定子がprivateに設定されています

string name;

int HP;

int MP;


void statusDataDisplay();


};

👆

のように設定されている


つまり


親クラスGameCharacterのメンバ変数


string name;

int HP;

int MP;

親クラスGameCharacterのメンバ関数

void statusDataDisplay();


のアクセス指定子が


             🌞private🌞



 に設定されている場合



親クラスGameCharacter

から

子クラスDragon へ



クラスの継承を


アクセス指定子public

アクセス指定子private

アクセス指定子protected

を用いて


class Dragon:public GameCharacter

class Dragon:private GameCharacter

class Dragon:protected GameCharacter



のように



実行したとき


どのように



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


string name;

int HP;

int MP;

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

void statusDataDisplay();




子クラスDragonのクラス宣言


class Dragon:public GameCharacter {

public:

void statusDataDisplay2(string a, int b, int c);


};



内へ引き継がれるんだ?」



ソーラー「


親クラスGameCharacterのメンバ変数


string name;

int HP;

int MP;


親クラスGameCharacterのメンバ関数

void statusDataDisplay();


のアクセス指定子が


             🌞private🌞


に設定されている場合は


クラスの継承を


アクセス指定子public

アクセス指定子private

アクセス指定子protected

を用いて


class Dragon:public GameCharacter

class Dragon:private GameCharacter

class Dragon:protected GameCharacter


を行った場合のすべてにおいて



private:

string name;

int HP;

int MP;


void statusDataDisplay();


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

class Dragon:public GameCharacter {


private:

string name;

int HP;

int MP;


void statusDataDisplay();



public:

void statusDataDisplay2(string a, int b, int c);


};


のように引き継がれることになります」



マックス「どういう理屈でそうなるんだ?


なら


🌞🌞🌞親クラスGameCharacterのクラス宣言が🌞🌞🌞

👇

class GameCharacter {


protected://👈ここに注目 アクセス指定子がprotectedに設定されています

string name;

int HP;

int MP;


void statusDataDisplay();


};

👆

のように設定されている


つまり


親クラスGameCharacterのメンバ変数


string name;

int HP;

int MP;


親クラスGameCharacterのメンバ関数


void statusDataDisplay();


のアクセス指定子が


             🌞protected🌞



 に設定されている場合



親クラスGameCharacter

から

子クラスDragon へ



クラスの継承を


アクセス指定子public

アクセス指定子private

アクセス指定子protected

を用いて


class Dragon:public GameCharacter

class Dragon:private GameCharacter

class Dragon:protected GameCharacter



のように



実行したとき


どのように



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


string name;

int HP;

int MP;

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

void statusDataDisplay();




子クラスDragonのクラス宣言内へ引き継がれるんだ?」



ソーラー「親クラスGameCharacterのメンバ変数


string name;

int HP;

int MP;


親クラスGameCharacterのメンバ関数


void statusDataDisplay();


のアクセス指定子が


             🌞protected🌞



 に設定されている場合はですね



class Dragon:public GameCharacter


のように


アクセス指定子を用いてクラスの継承を行う場合は


protected:

string name;

int HP;

int MP;


void statusDataDisplay();


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

class Dragon:public GameCharacter {


protected:

string name;

int HP;

int MP;


void statusDataDisplay();



public://👈クラスDragonのメンバ変数のアクセス指定子は関係してきません

void statusDataDisplay2(string a, int b, int c);


};


のように引き継がれることになります




親クラスGameCharacterのメンバ変数


string name;

int HP;

int MP;


親クラスGameCharacterのメンバ関数


void statusDataDisplay();


のアクセス指定子が


             🌞protected🌞



 に設定されている場合に



class Dragon:protected GameCharacter


のように


アクセス指定子protectedを用いてクラスの継承を行う場合は



protected:

string name;

int HP;

int MP;


void statusDataDisplay();


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

class Dragon:protected GameCharacter {


protected:

string name;

int HP;

int MP;


void statusDataDisplay();



public://👈クラスDragonのメンバ変数のアクセス指定子は関係してきません

void statusDataDisplay2(string a, int b, int c);


};


のように引き継がれることになります



             次に



class Dragon:protected GameCharacter

につづいて

class Dragon:private GameCharacter


のように


アクセス指定子privateを用いてクラスの継承を行う場合ですね



親クラスGameCharacterのメンバ変数


string name;

int HP;

int MP;


親クラスGameCharacterのメンバ関数


void statusDataDisplay();


のアクセス指定子が


             🌞protected🌞



 に設定されている状態で


class Dragon:private GameCharacter


のように


アクセス指定子privateを用いてクラスの継承を行う場合は


private:

string name;

int HP;

int MP;


void statusDataDisplay();


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

class Dragon:private GameCharacter {


private:

string name;

int HP;

int MP;


void statusDataDisplay();



public://👈クラスDragonのメンバ変数のアクセス指定子は関係してきません

void statusDataDisplay2(string a, int b, int c);


};


のように引き継がれることになります」




マックス 「?ど~いう仕組みでそうなってるぅ?




              え~


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

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

のアクセス指定子が


public


に設定されている状態で



アクセス指定子protected

アクセス指定子public

アクセス指定子private


を用いて


class Dragon:protected GameCharacter

class Dragon:public GameCharacter

class Dragon:private GameCharacter


のようにクラスの継承を行うと



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

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

のアクセス指定子が

それぞれ

public

private

protected


になっている状態で子クラスDragonのクラス宣言内に引き継がれ



            次に


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

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

のアクセス指定子が


private


に設定されている状態で


クラスの継承を



アクセス指定子protected

アクセス指定子public

アクセス指定子private


を用いて


class Dragon:protected GameCharacter

class Dragon:public GameCharacter

class Dragon:private GameCharacter


のようにクラスの継承を行うと



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

親クラスGameCharacter

のメンバ関数宣言

のアクセス指定子は

すべて

private


になっている状態で子クラスDragonのクラス宣言内に引き継がれ


             次に



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

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

のアクセス指定子が


protected


に設定されている状態で


クラスの継承を



アクセス指定子protected

アクセス指定子public

アクセス指定子private


を用いて


class Dragon:protected GameCharacter

class Dragon:public GameCharacter

class Dragon:private GameCharacter


のようにクラスの継承を行うと


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

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

のアクセス指定子は


protected

protected

private


になっている状態で子クラスDragonのクラス宣言内に引き継がれるんだろう?



じゃあ


これらのパターンを全部暗記しないといけないということか?」


ソーラー「そんなことはないんです


アクセス指定子を用いたクラスの継承の仕組みは


とても簡単で


     🌞親クラスのメンバ変数、メンバ関数宣言のアクセス指定子を🌞


         💖クラスの継承のときにもちいる💖


            💖アクセス指定子で💖


          🌞置き換え その状態で🌞



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


      🌞親クラスのメンバ変数、メンバ関数宣言のアクセス指定子を🌞


を引き継ぐという仕組みになっています



そして


親クラスのメンバ変数、メンバ関数宣言のアクセス指定子が置き換わるのは


親クラスのメンバ変数、メンバ関数宣言のアクセス指定子より


クラスの継承の時に使われるアクセス指定子の方が


            🌞優先順位🌞


が高い場合のみです


優先順位は


public<protected<privateとなっています」


マックス「優先順位?」


ソーラー「たとえば


🌞🌞🌞親クラスのクラス宣言が🌞🌞🌞

👇

class GameCharacter {


public://👈ここに注目 アクセス指定子がpublicに設定されています

string name;

int HP;

int MP;


void statusDataDisplay();


};

👆

のように設定されているとします


親クラスのメンバ変数、メンバ関数宣言のアクセス指定子は


publicですね


この状態で

protected

private


を用いて継承をおこなうのなら


親クラスGameCharacterのメンバ変数、メンバ関数宣言のアクセス指定子


publicが

優先順位の高い

protected

private


に置き換えられた状態で


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


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



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



publicを用いて継承を行うのなら優先順位が同じなので


置き換えはおこりません


もし


🌞🌞🌞親クラスGameCharacterのクラス宣言が🌞🌞🌞

👇

class GameCharacter {


protected://👈ここに注目 アクセス指定子がprotectedに設定されています

string name;

int HP;

int MP;


void statusDataDisplay();


};

👆

のように設定されているとします


親クラスGameCharacterのメンバ変数、メンバ関数宣言のアクセス指定子は


protectedですね



この場合は


優先順位の高い

private


を用いて継承をおこなうのなら


親クラスGameCharacterのメンバ変数、メンバ関数宣言のprotectedは


優先順位の高い


private


に置き換えられた状態で


private://👈ここに注目 アクセス指定子がprivateに設定されています

string name;

int HP;

int MP;


void statusDataDisplay();



のように子クラスDragonのクラス宣言内に引き継がれることになります


protectedを用いて継承を行うのなら優先順位が同じなので


置き換えはおこりませんし


publicを用いて継承を行うのならpublicの優先順位はprotectedより低いので


置き換えはおこりません


親クラスGameCharacterのメンバ変数、メンバ関数宣言のprotectedは


protected://👈ここに注目 アクセス指定子がprivateに設定されています

string name;

int HP;

int MP;


void statusDataDisplay();



のように変化しないまま継承されることになります」






マックス 「いやん、そんなに簡単なことなのか~い」





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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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