アクセス指定子がpublicに設定されている親クラスのコンストラクタは子クラスに引き継がれることになります 

親クラスと子クラスにコンストラクタが設定されている場合に親クラス型のオブジェクト宣言、子クラス型のオブジェクト宣言が実行されるとどのようなことがおこるかな?

ソーラー「


親クラス GameCharacter

親クラス GameCharacterを継承した子クラスHuman

は以下のように設定されていました


まずは


//👇🌞🌞🌞親クラスGameCharacterとそのメンバ関数statusDataDisplay()の定義です🌞🌞🌞


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を継承した子クラスHumanとそのメンバ関数useSuperMarket()の定義です🌞🌞🌞


class Human:public GameCharacter {

public:

void useSuperMarket();


};


//👇🌞🌞🌞子クラスHumanのメンバ関数useSuperMarket()の定義です🌞🌞🌞

void Human::useSuperMarket() {

cout << name << "はスーパーマーケットにいった" << "\n";

cout << name << "は小豆バーをみつけた!" << "\n";

HP += 10;


cout << name << "のHPは10回復した!" << "\n";


}


ソーラー「子クラスHumanに


(人間)Human型のキャラクターの(小豆バーを食べて体力を回復させるという)挙動をとりあつかう関数


useSuperMarket()


を設定したってわけだね」




マックス「親クラスGameCharacterと親クラスGameCharacterを継承した子クラスHumanか・・・


ところで


親クラス GameCharacter

子クラス Humanに


それぞれコンストラクタが設定されている場合


もし


親クラスGameCharacter型のオブジェクト宣言が実行され


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


が生成されたなら


同時に 自動的に


親クラスGameCharacter型のオブジェクトのコンストラクタ


が実行され


もし


子クラスHuman型のオブジェクト宣言が実行され


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


が生成されたなら


同時に 自動的に


子クラスHuman型のオブジェクトのコンストラクタ


が実行されることになるのか?」


ソーラー「それは みなさん 気になるところですね


では


次は


親クラスGameCharacter

親クラスGameCharacterを継承した子クラスHuman

それぞれ独自のクラスのコンストラクタを設定した状態で


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


GameCharacter Lyliane;


🍎 あるいは🍎


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


Human Lyliane;


を実行してみます


同じ名前Lylianeのオブジェクト宣言は


1回しかできない


つまり


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


GameCharacter Lyliane;



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


Human Lyliane;


を同時に実行することはできないからね




_________________________


(´▽`*)ちょっとクラスのコンストラクタについておさらいしてみましょう


のコーナーです🐤  🐤  🐤


鳥が飛んでいますね


クラスのコンストラクタとは


クラス宣言内で


メンバ関数宣言される


特殊な


クラスのメンバ関数のことでした。



オブジェクト宣言が行われオブジェクトが生成されると


同時に自動的に


オブジェクトのコンストラクタが


実行されます。


オブジェクトのコンストラクタとは


オブジェクトのメンバ関数のことでした


オブジェクトのメンバ関数とは


クラスのメンバ関数内で使用されている


クラスのメンバ変数に


オブジェクトのメンバ変数が


代入されたもののことでしたね。



                   solarplexussより

_________________________


ソーラー「う~ん


たとえば


親クラスGameCharacterに


親クラスGameCharacterのコンストラクタ


GameCharacter()


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

👇


class GameCharacter {


public:

string name;

int HP;

int MP;


void statusDataDisplay();


GameCharacter();//🌞コンストラクタのメンバ関数宣言です


};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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

}


//🌞👇親クラスGameCharacterのコンストラクタの定義です


GameCharacter::GameCharacter() {


name="リリアーネ";

HP=0;

MP=0;


cout << "親クラスGameCharacterのコンストラクタによりオブジェクトのメンバ変数が初期化されました" << "\n";

}



そして


親クラスGameCharacteを継承した子クラスHuman


のコンストラクタHuman()


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

👇


class Human:public GameCharacter {

public:

void useSuperMarket();


Human();//👈🌞コンストラクタのメンバ関数宣言です

};


//👇🌞🌞🌞クラスHumanのメンバ関数の定義です🌞🌞🌞

void Human::useSuperMarket() {

cout << name << "はスーパーマーケットにいった" << "\n";

cout << name << "は小豆バーをみつけた!" << "\n";

HP += 10;


cout << name << "のHPは10回復した!" << "\n";


}


//🌞👇子クラスHumanのコンストラクタの定義です


Human::Human() {


name="リリアーネ";

HP=100;

MP=100;


cout << " 子クラスHumanのコンストラクタによりオブジェクトのメンバ変数が初期化されました" << "\n";

}




ソーラー「このように


親クラスGameCharacter

親クラスGameCharacterを継承した子クラスHuman



それぞれ独自のコンストラクタが設定された状態で


まずは


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


GameCharacter Lyliane;


を実行してみたいと思います


main関数内で


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


GameCharacter Lyliane;


が実行され


親クラスGameCharacter型のオブジェクトLylianeが生成されると


同時に


親クラスGameCharacter型のオブジェクトLylianeのコンストラクタが実行されることになります


すなわち


//🌞👇親クラスGameCharacterのコンストラクタの定義


GameCharacter::GameCharacter() {


name="リリアーネ";

HP=0;

MP=0;


cout << "親クラスGameCharacterのコンストラクタによりオブジェクトのメンバ変数が初期化されました" << "\n";

}

のブロック内{}の


name="リリアーネ";

HP=0;

MP=0;


cout << "親クラスGameCharacterのコンストラクタによりオブジェクトのメンバ変数が初期化されました" << "\n";




クラスGameCharacterのメンバ変数


name

HP

MP



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


Lyliane.name

Lyliane.HP

Lyliane.MP


が代入された


Lyliane.name="リリアーネ";

Lyliane.HP=0;

Lyliane.MP=0;


cout << "親クラスGameCharacterのコンストラクタによりオブジェクトのメンバ変数が初期化されました" << "\n";


が実行されることになります。」



そのプログラムはこちらとなります

👇

#include <iostream>

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

using namespace std;


//👇🌞🌞🌞親クラスGameCharacterとそのメンバ関数statusDataDisplay()の定義です🌞🌞🌞


class GameCharacter {


public:

string name;

int HP;

int MP;


void statusDataDisplay();

GameCharacter();//🌞👈コンストラクタのメンバ関数宣言です


};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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

}


//🌞👇親クラスGameCharacterのコンストラクタの定義です


GameCharacter::GameCharacter() {


name = "リリアーネ";

HP = 0;

MP = 0;


cout << "親クラスGameCharacterのコンストラクタによりオブジェクトのメンバ変数が初期化されました" << "\n";


}

//👇🌞🌞🌞親クラスGameCharacterを継承した子クラスHumanとそのメンバ関数useSuperMarket()とコンストラクタHuman()の定義です🌞🌞🌞


class Human:public GameCharacter {

public:

void useSuperMarket();


Human();


};


//👇🌞🌞🌞子クラスHumanのメンバ関数の定義です🌞🌞🌞

void Human::useSuperMarket() {

cout << name << "はスーパーマーケットにいった" << "\n";

cout << name << "は小豆バーをみつけた!" << "\n";

HP += 10;


cout << name << "のHPは10回復した!" << "\n";


}


//🌞👇子クラスHumanのコンストラクタの定義です


Human::Human() {


name = "リリアーネ";

HP = 100;

MP = 100;


cout << " 子クラスHumanのコンストラクタによりのオブジェクトのメンバ変数が初期化されました" << "\n";


}




int main() {


GameCharacter Lyliane;

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


Lyliane.statusDataDisplay();

return 0;

}


プログラムの実行結果


親クラスGameCharacterのコンストラクタによりオブジェクトのメンバ変数が初期化されました

リリアーネ

HP 0

MP 0


マックス「main関数のプログラム短かっ!



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


GameCharacter Lyliane;


の実行にともない自動的に


親クラスGameCharacter型のオブジェクトLylianeのコンストラクタが実行されたわけだ


なので


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


Lyliane.name

Lyliane.HP

Lyliane.MP


Lyliane.name="リリアーネ";

Lyliane.HP=0;

Lyliane.MP=0;


と初期化されているんだな😊/




ソーラー「次は


親クラスGameCharacter

親クラスGameCharacterを継承した子クラスHuman



それぞれ独自のコンストラクタが設定された状態で



Lylianeの親クラスGameCharacterを継承した子クラスHuman型のオブジェクト宣言


Human Lyliane;


を実行してみたいと思います


そのプログラムはこちらとなります」

👇


#include <iostream>

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

using namespace std;


//👇🌞🌞🌞親クラスGameCharacterとそのメンバ関数statusDataDisplay()の定義です🌞🌞🌞


class GameCharacter {


public:

string name;

int HP;

int MP;


void statusDataDisplay();

GameCharacter();


};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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

}


//🌞👇親クラスGameCharacterのコンストラクタの定義です


GameCharacter::GameCharacter() {


name = "リリアーネ";

HP = 0;

MP = 0;


cout << "親クラスGameCharacterのコンストラクタによりオブジェクトのメンバ変数が初期化されました" << "\n";


}

//👇🌞🌞🌞親クラスGameCharacterを継承した子クラスHumanとそのメンバ関数useSuperMarket()とコンストラクタHuman()の定義です🌞🌞🌞


class Human:public GameCharacter {

public:

void useSuperMarket();


Human();


};


//👇🌞🌞🌞子クラスHumanのメンバ関数の定義です🌞🌞🌞


void Human::useSuperMarket() {

cout << name << "はスーパーマーケットにいった" << "\n";

cout << name << "は小豆バーをみつけた!" << "\n";

HP += 10;


cout << name << "のHPは10回復した!" << "\n";


}


//🌞👇子クラスHumanのコンストラクタの定義です


Human::Human() {


name = "リリアーネ";

HP = 100;

MP = 100;


cout << "子クラスHumanのコンストラクタによりのオブジェクトのメンバ変数が初期化されました" << "\n";


}




int main() {



Human Lyliane;


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


Lyliane.statusDataDisplay();


return 0;

}


プログラムの実行結果


親クラスGameCharacterのコンストラクタによりオブジェクトのメンバ変数が初期化されました

子クラスHumanのコンストラクタによりオブジェクトのメンバ変数が初期化されました

リリアーネ

HP 100

MP 100


マックス「?なんだ?


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


Human Lyliane;


を実行すると


子クラスHumanのコンストラクタ


Human()


の定義

👇

Human::Human() {


name = "リリアーネ";

HP = 100;

MP = 100;


cout << "子クラスHumanのコンストラクタによりオブジェクトのメンバ変数が初期化されました" << "\n";


}

のブロック{}内の


name = "リリアーネ";

HP = 100;

MP = 100;


cout << "子クラスHumanのコンストラクタによりオブジェクトのメンバ変数が初期化されました" << "\n";



クラスHumanのメンバ変数

name

HP

MP

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


Lyliane.name

Lyliane.HP

Lyliane.MP


が代入された

👇

Lyliane.name="リリアーネ";

Lyliane.HP=100;

Lyliane.MP=100;


cout << "子クラスHumanのコンストラクタによりオブジェクトのメンバ変数が初期化されました" << "\n";

👆

が実行されることになる・・・




それより先に


              同時に



親クラスGameCharacterのコンストラクタ


GameCharacter()


の定義

👇

GameCharacter::GameCharacter() {


name = "リリアーネ";

HP = 0;

MP = 0;


cout << "親クラスGameCharacterのコンストラクタによりオブジェクトのメンバ変数が初期化されました" << "\n";


}


のブロック{}内の



name = "リリアーネ";

HP = 0;

MP = 0;


cout << "親クラスGameCharacterのコンストラクタによりオブジェクトのメンバ変数が初期化されました" << "\n";




親クラスGameCharacterのメンバ変数💖💖💖💖💖💖💖💖💖💖💖💖💖

name

HP

MP


((⭐親クラスGameCharacterのメンバ変数💖💖💖💖💖💖💖💖💖💖💖💖💖

name

HP

MP

子クラスHumanに引き継がれているので


子クラスHumanのメンバ変数💖💖💖💖💖💖💖💖💖💖💖💖💖

name

HP

MP

と言い換えることができます⭐))



子クラスHuman型のオブジェクトLylianeのメンバ変数💖💖💖💖💖💖💖💖💖💖💖💖💖


Lyliane.name

Lyliane.HP

Lyliane.MP

が代入されたものが実行されているのか?・・・




          なんで   そうなるぅ



ソーラー「

(´▽`*)(´▽`*)(´▽`*)/

そうなんです。


そこがポイントなんです。


クラスの継承により


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


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


string name;

int HP;

int MP;


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


void statusDataDisplay();


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


GameCharacter();



が引き継がれているんだ(*´▽`*)


アクセス指定子がpublicに設定されているからだね」


マックス「はいぃ?」



ソーラー「


   💖💖アクセス指定子がpublicに設定されている💖💖


💖💖親クラスGameCharacterのコンストラクタのメンバ関数宣言💖💖


        GameCharacter();



子クラスHumanに引き継がれることになります


つまり


         🌞子クラスHumanに🌞


💖💖親クラスGameCharacterのコンストラクタのメンバ関数宣言💖💖


        GameCharacter();



        💖💖設定されていることになります💖💖


つまり


子クラスHumanに


コンストラクタGameCharacter()


が設定されていることになるんだね


結局


子クラスHumanのクラス宣言には


2つのコンストラクタのメンバ関数宣言


GameCharacter();

Human();


が設定されていることになるんだね


だから


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


Human Lyliane;


が実行されると


子クラスHuman型のオブジェクトLylianeの


親クラスGameCharacterのコンストラクタ


子クラスHuman型のオブジェクトLylianeの


子クラスHumanのコンストラクタ

両方とも


自動的に実行されるんだね。


そのとき


親クラスGameCharacterのコンストラクタ

子クラスHumanのコンストラクタ

より先に実行され


親クラスGameCharacterのコンストラクタの定義に代入されるのは


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


となります




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


string name;

int HP;

int MP;


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


void statusDataDisplay();


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


GameCharacter();


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


クラスの継承により


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


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


string name;

int HP;

int MP;


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


void statusDataDisplay();


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

GameCharacter();



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



そして



親クラスGameCharacterのコンストラクタ


GameCharacter()が実行される際



親クラスGameCharacterのコンストラクタ


GameCharacter()


の定義

👇

GameCharacter::GameCharacter() {


name = "リリアーネ";

HP = 0;

MP = 0;


cout << "親クラスGameCharacterのコンストラクタによりオブジェクトのメンバ変数が初期化されました" << "\n";


}


親クラスGameCharacterのメンバ変数💖💖💖💖💖💖💖💖💖💖💖💖💖

name

HP

MP



に子クラスHuman型のオブジェクトLylianeのメンバ変数💖💖💖💖💖💖💖💖💖💖💖💖💖


Lyliane.name

Lyliane.HP

Lyliane.MP

が代入されたものが実行されることになります



子クラスHumanのコンストラクタ


Human()が実行される際



子クラスHumanのコンストラクタ


Human()


の定義

👇

Human::Human() {


name = "リリアーネ";

HP = 100;

MP = 100;


cout << "子クラスHumanのコンストラクタによりオブジェクトのメンバ変数が初期化されました" << "\n";


}

のブロック{}内の


name = "リリアーネ";

HP = 100;

MP = 100;


cout << "子クラスHumanのコンストラクタによりオブジェクトのメンバ変数が初期化されました" << "\n";



クラスHumanのメンバ変数

name

HP

MP

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


Lyliane.name

Lyliane.HP

Lyliane.MP


が代入された

👇

Lyliane.name="リリアーネ";

Lyliane.HP=100;

Lyliane.MP=100;


cout << "子クラスHumanのコンストラクタによりオブジェクトのメンバ変数が初期化されました" << "\n";

👆


が実行されることになります



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


Human Lyliane;


が実行され


子クラスHuman型のオブジェクトLylianeが生成される際


自動的に


親クラスGameCharacterのコンストラクタ

子クラスHumanのコンストラクタ


が実行されることになりますが


そのとき



親クラスGameCharacterのコンストラクタGameCharacter()の定義

子クラスHumanのコンストラクタHuman()の定義の


メンバ変数

name

HP

MP


に代入されるのは


ともに


子クラスHuman型のオブジェクトLylianeのメンバ変数💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖

Lyliane.name

Lyliane.HP

Lyliane.MP

となるんだね


(´▽`*)(´▽`*)(´▽`*)/


やっほ~~い~

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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