親クラス&型の参照変数には親クラス型のオブジェクト あるいは 子クラス型のオブジェクトを代入することができます

ソーラー「前のエピソードで見てきたように


親クラス&型の参照変数には

親クラス型のオブジェクトを


子クラス&型の参照変数には

子クラス型のオブジェクトを


代入することができました」


マックス「


int&型の参照変数には


int型の変数を


float&型の参照変数には


float型の変数を


代入することができるのに似ているな。」


てんC「大分、前のエピソードで


学んだことでしたね。」


ソーラー「そうなんです。


親クラス&型の参照変数には

親クラス型のオブジェクトを


子クラス&型の参照変数には

子クラス型のオブジェクトを



代入できるわけですが・・・・・」




次のプログラムをご覧ください。


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

cout << "親クラスのメンバ関数statusDataDisplay()が実行されました" << "\n";

}




class Dragon : public GameCharacter {


public:


void statusDataDisplay2();


};



void Dragon::statusDataDisplay2() {


cout << name << "\n";

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

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

cout << " 子クラスのメンバ関数statusDataDisplay()が実行されました" << "\n";

}




int main() {


GameCharacter Pokky;

//👆Pokkyの親クラスGameCharacter型のオブジェクト宣言をおこなっています


GameCharacter& a= Pokky;


//(参照変数宣言は参照変数宣言と同時に初期化される必要があります)


//👆GameCharacter&型の参照変数aを作製しました


a.name = "ポッキー";

a.HP = 15;

a.MP = 5;


a.statusDataDisplay();


return 0;

}


プログラムの実行結果


ポッキー

HP 15

MP 5

親クラスのメンバ関数statusDataDisplay()が実行されました


ソーラー「このプログラムでは


aの親クラスGameCharacter&型の参照変数宣言


GameCharacter& a;


によって作製された


親クラスGameCharacter&型の参照変数


a



Pokkyの親クラスGameCharacter型のオブジェクト宣言


GameCharacter Pokky;


によって作製された


親クラスGameCharacter型のオブジェクトPokkyが


GameCharacter& a= Pokky;


代入されています。


ここで


面白い現象が起こるんだよぉ」


マックス「面白い現象?


イカが空を飛ぶのか?」


てんC「もしかして


|🐙《たこ

》が空を飛ぶのですか?」


ソーラー「いや、飛ばないんだけど・・・


ここでは・・


aの親クラスGameCharacter&型の参照変数宣言


GameCharacter& a;


によって作製された


親クラスGameCharacter&型の参照変数


a



Pokkyの親クラスGameCharacter型のオブジェクト宣言


GameCharacter Pokky;


によって作製された


親クラスGameCharacter型のオブジェクトPokkyが


GameCharacter& a= Pokky;


のように


代入されています。




親クラスGameCharacter&型の参照変数宣言


GameCharacter& a;


によって作製された


親クラスGameCharacter&型の参照変数


a



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


Dragon Pokky;


によって作製された


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



GameCharacter& a= Pokky;



代入することもできるんです。」


マックス「はあ?


親クラスGameCharacter&型の参照変数宣言


GameCharacter& a;


によって作製された


親クラスGameCharacter&型の参照変数


a



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


Dragon Pokky;


によって作製された


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



GameCharacter& a= Pokky;



代入することができるぅ??


ええと


親クラスGameCharacter&型の参照変数宣言


GameCharacter& a;


によって作製された


親クラスGameCharacter&型の参照変数


a



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


Dragon Pokky;


によって作製された


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



GameCharacter& a= Pokky;



代入??



子クラスDragon&型の参照変数宣言


Dragon& a;


によって作製された


子クラスDragon&型の参照変数


a



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


Dragon Pokky;


によって作製された


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



Dragon& a= Pokky;



代入できるのまちがいじゃないか?



まるで


int&型の参照変数に


float型の変数を代入するみたいなことを


いってないか?


なんでぇ」


ソーラー「何でもです🐁



なあんてね



親クラスGameCharacter型のオブジェクトには


子クラスDragon型のオブジェクトを代入することができましたね


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

👇

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

cout << "親クラスのメンバ関数statusDataDisplay()が実行されました" << "\n";

}




class Dragon :public GameCharacter {


public:


void statusDataDisplay2();


};



void Dragon::statusDataDisplay2() {


cout << name << "\n";

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

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

cout << " 子クラスのメンバ関数statusDataDisplay()が実行されました" << "\n";

}




int main() {




GameCharacter AI;


AI.name = "未設定";

AI.HP = 0;

AI.MP = 0;




//👆AIの親クラスGameCharacter型のオブジェクト宣言をおこなっています


Dragon Pokky;

//👆Pokkyの子クラスDragon型のオブジェクト宣言をおこなっています



Pokky.name = "ポッキー";

Pokky.HP = 15;

Pokky.MP = 5;



AI = Pokky;

//👆🌞🌞🌞ここが最大のポイントです🌞🌞🌞

//👆🌞🌞🌞親クラスGameCharacter型のオブジェクトAIに🌞🌞🌞

//🌞🌞🌞子クラスDragon型のオブジェクトPokkyを代入しています🌞🌞🌞


AI.statusDataDisplay();


return 0;

}


ポッキー

HP 15

MP 5

親クラスのメンバ関数statusDataDisplay()が実行されました


ソーラー「


親クラスGameCharacter型のオブジェクトAIに


子クラスDragon型のオブジェクトPokkyを代入する


AI = Pokky;


を実行することにより


親クラスGameCharacter型のオブジェクトAIのメンバ変数


AI.name

AI.HP

AI.MP


Pokky.name

Pokky.HP

Pokky.MP


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


ですので


AI.name

AI.HP

AI.MP

格納されているデータを


AI.name = "未設定";

AI.HP = 0;

AI.MP = 0;


から


AI.name = "ポッキー";

AI.HP = 15;

AI.MP = 5;


に変更することができました・ね(^_-)-☆


そして


AI = Pokky;


が実行されて


親クラスGameCharacter型のオブジェクトAI に

子クラスDragon型のオブジェクトPokkyが代入されていても



AIは親クラスGameCharacter型のオブジェクトであることにかわりはありません


ですので


AI.statusDataDisplay();


を実行すると



親クラスGameCharacterのメンバ関数の定義


void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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

cout << "親クラスのメンバ関数statusDataDisplay()が実行されました" << "\n";

}




name

HP

MP


AI.name

AI.HP

AI.MP

が代入されたものが実行されるので


コマンドプロンプト画面に


ポッキー

HP 15

MP 5

親クラスのメンバ関数statusDataDisplay()が実行されました


が表示されることになります



逆に



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


親クラスGameCharacter型のオブジェクトAI を


Pokky=AI;


のように代入することはできません



このとき


親クラスGameCharacter型のオブジェクトAI に

子クラスDragon型のオブジェクトPokkyを代入する


AI = Pokky;


が実行できるのは


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


親クラスGameCharacter型のオブジェクトでもあり

子クラスDragon型のオブジェクトであるからなのです



反対に


AI は


親クラスGameCharacter型のオブジェクトですが

子クラスDragon型のオブジェクトではありません



同様に


親クラスGameCharacter&型の参照変数aに


親クラスGameCharacter型のオブジェクトAI


を代入することもできれば


親クラスGameCharacter&型の参照変数aに



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


代入することもできます」

















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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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