🍎class Dragon:private GameCharacter🍎と🍊class Dragon:protected GameCharacter🍊の継承について詳しく調べてみましょう

🌞つづきです🌞



ソーラー「となると


        🍎class Dragon:private GameCharacter🍎



        🍊class Dragon:protected 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);


};



親クラスGameCharacter

から

子クラスDragon へ


クラスの継承を


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


👇

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


string name;

int HP;

int MP;


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


void statusDataDisplay();

👆




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


が付けられた状態の

👇

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

string name;

int HP;

int MP;


void statusDataDisplay();

👆

として


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


仕組みはとても単純ですね」



マックス「おおんん、これは簡単」


ソーラー「


ところで前のエピソードでも学びましたが


子クラスDragonのメンバ変数宣言のアクセス指定子が


このように

👇


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

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.name

Pokky.HP

Pokky.MP

を使用することはできず



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



Pokky.name

Pokky.HP

Pokky.MP



                直接


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




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



  

             間接的に


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



Pokky.name

Pokky.HP

Pokky.MP


データを代入することができましたね


同様に


継承関係にない他のクラス(のメンバ関数)内で


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


Dragon Pokky;


を実行して


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



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



Pokky.name

Pokky.HP

Pokky.MP

は生成されないので


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



Pokky.name

Pokky.HP

Pokky.MP

を使用することはできず



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



Pokky.name

Pokky.HP

Pokky.MP



                直接


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




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



  

             間接的に


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



Pokky.name

Pokky.HP

Pokky.MP


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


おまけでした



次に


親クラス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 に引き継がれます




親クラスGameCharacter

から

子クラスDragon へ


クラスの継承を


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



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

👇

class Dragon:private GameCharacter {

public:

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


};


👆


この親クラスGameCharacterを継承した子クラスDragonのクラス宣言には見えていないだけで


アクセス指定子privateがつけられた


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


string name;

int HP;

int MP;


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


void statusDataDisplay();


が引き継がれています


例えば


次のような感じです


class Dragon:private GameCharacter {


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

string name;

int HP;

int MP;


void statusDataDisplay();


public:

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


};


アクセス指定子がclass Dragon:private GameCharacterのように


privateに設定されていても


        💖継承自体はおこなわれているというわけです💖


ですが


main関数内で


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


Dragon Pokky;


を実行して


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


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


Pokky.name

Pokky.HP

Pokky.MP


は生成されません


ですので


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


Pokky.name

Pokky.HP

Pokky.MP



          直接


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



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


string name;

int HP;

int MP;


継承することと


main関数内で


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


Dragon Pokky;


を実行して


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



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


Pokky.name

Pokky.HP

Pokky.MP


が生成されるかどうかは



             😊別問題😊



なんだね



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


このように

👇


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

string name;

int HP;

int MP;

👆

publicになっている状態で


class Dragon:private GameCharacterのように


アクセス指定子privateを使ってクラスの継承を行うと


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



このように

👇


class Dragon:private GameCharacter {


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

string name;

int HP;

int MP;


void statusDataDisplay();


public:

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


};


👆

アクセス指定子がprivateになっている状態で親クラスGameCharacterのメンバ変数宣言が


記述されていることになります







この場合


                main関数内で



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


Dragon Pokky;


を実行して


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


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



Pokky.name

Pokky.HP

Pokky.MP


は生成されないので


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



Pokky.name

Pokky.HP

Pokky.MP


                直接


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




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


statusDataDisplay2(string a, int b, int c)をもちいて



  

             間接的に


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



Pokky.name

Pokky.HP

Pokky.MP


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


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

👇

#include <iostream>

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

using namespace std;


//👇🌞🌞🌞クラスGameCharacterです🌞🌞🌞

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";

}





//👇🌞🌞🌞クラスGameCharacterを継承したクラスDragonです🌞🌞🌞


class Dragon :private GameCharacter {

public:

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


};



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


name = a;

HP = b;

MP = c;


cout << name << "\n";

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

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

}


int main() {


Dragon Pokky;


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


return 0;

}


ビルド実行結果


ポッキー

HP 15

MP 5






そして


class Dragon:private GameCharacterのように


継承を行った場合



同様に


継承関係にない他のクラス(のメンバ関数)内で


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


Dragon Pokky;


を実行して


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



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



Pokky.name

Pokky.HP

Pokky.MP


は生成されないので


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



Pokky.name

Pokky.HP

Pokky.MP

を使用することはできず



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



Pokky.name

Pokky.HP

Pokky.MP



                直接


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




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



  

             間接的に


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



Pokky.name

Pokky.HP

Pokky.MP


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


おまけでした


























マックス「おお これが


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


        class Dragon:private GameCharacterのように


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



   

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


        class Dragon:protected GameCharacterのように


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




の違いってわけかあ


って


            違いはないじゃないか~~~~~い


たんに



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


        class Dragon:private GameCharacterのように


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


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


string name;

int HP;

int MP;


のアクセス指定子が


privateに変更された状態で


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




 

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


        class Dragon:protected GameCharacterのように


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


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


string name;

int HP;

int MP;


のアクセス指定子が


protectedに変更された状態で


子クラスDragonのクラス宣言内に引き継がれるってだけで


何の違いもない?


なんだ


もうぅ 簡単じゃないか?」


ソーラー「てへぺろ


そうなんです


ただ単に


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



              public


に設定された状態で



       class Dragon:public GameCharacterのように


継承を行った場合は



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


              publicからpublic


に書き換えられた状態で


子クラスDragonに引き継がれ


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



              public


に設定された状態で


       class Dragon:private GameCharacterのように


継承を行った場合は



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


              publicからprivate


に書き換えられた状態で


子クラスDragonに引き継がれ



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



              public


に設定された状態で


       class Dragon:protected GameCharacterのように


継承を行った場合は



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


             publicからprotected


に書き換えられた状態で


子クラスDragonに引き継がれるというわけです



ただし


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



              public

でなく


private


protected


の場合は


ちょっとだけお話が変わってきますが


同じようなネタで


仕組みはとても簡単です」







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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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