🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
親クラスと子クラスにコンストラクタが設定されている場合に親クラス型のオブジェクト宣言、子クラス型のオブジェクト宣言が実行されるとどのようなことがおこるかな?
アクセス指定子が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.name
Lyliane.HP
Lyliane.MP
となるんだね
(´▽`*)(´▽`*)(´▽`*)/
やっほ~~い~
」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます