クラスの継承をおこなうと親クラスを変更するだけですべての子クラスに変更を加えることができるようになります

ソーラー「今日は


          🌞クラスの継承🌞


をおこなうと



どの様な点が便利なのかを考察してみたいと思います


クラスGameCharacterを継承元となる親クラスとし


クラスGameCharacterを継承する子クラス


Human

Dragon

Fairy

を作製したいと思います」


マックス「確か


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

👇

class Dragon:public GameCharacter {

public:

void useFireRecovery(GameCharacter& a);


};


👆

こんな感じで簡単だったな


子クラスDragonのメンバ関数


useFireRecovery(GameCharacter& a)の定義は

👇

void Dragon::useFireRecovery(GameCharacter& a) {

cout << name << "は灼熱のフレアを" << a.name << "に吐いた !" << "\n";

cout << a.name << "は灼熱のフレアを受け燃え上がった!" << "\n";


a.HP += 10;


cout << a.name << "の体力は10回復した" << "\n";


}


👆こんなんだったか」


てんC「はい😊


次は


クラスGameCharacterを継承した子クラスFairyを作製してみたいと思います



クラスGameCharacterを継承した子クラスFairyのクラス宣言は

👇

class Fairy:public GameCharacter {

public:

void useFeatherWindHealing(GameCharacter& a);


};


👆

としてみたいと思います


以前に登場した


クラスFairyのメンバ関数


useFeatherWindHealing(GameCharacter& a)の定義は

👇



void Fairy::useFeatherWindHealing(GameCharacter& a) {

cout << name << "は羽をはばたかせた"<< "\n";

a.HP += 8;


cout << a.name << "のHPは8回復した!" << "\n";


}

👆

このような感じでしたね?


このクラスFairyのメンバ関数を用いれば

引数に代入された

GameCharacter型のオブジェクトのHPを回復することのできる


          『フェザーウィンドヒーリング』



Fairy(妖精)型のゲームキャラクターが使用できるようになります」


マックス「いよ~し


次は


クラスGameCharacterを継承した子クラスHumanを作製してみるとするか


腕がなるぜ!


クラスGameCharacterを継承した子クラスHumanのクラス宣言は

👇

class Human:public GameCharacter {

public:

void useSuperMarket();


};


👆


どうだ?」


ソーラー「


useSuperMarket()


ってどんな関数なんですか?」


マックス「ふふっ そうだなあ


いまから


useSuperMarket()がどんな関数かを決めてみるか?



こんなのはどうだ?



クラスHumanのメンバ関数


useSuperMarket()


の定義はこんなんだぞい?」

👇



void Human::useSuperMarket(){

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

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

HP += 10;


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


}

👆


んはは?どうだ?


このクラスHumanのメンバ関数


useSuperMarket()


が用いられたプログラムはこれだ

👇


#include <iostream>

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

using namespace std;


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

class GameCharacter {


public:

string name;

int HP;

int MP;


void statusDataDisplay();


//クラスGameCharacterにはuseFireRecovery(GameCharacter& a)を設定しません

};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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

}





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


class Human:public GameCharacter {

public:

void useSuperMarket();


};



void Human::useSuperMarket() {

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

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

HP += 10;


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


}


int main() {


Human Lyliane;


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

Lyliane.HP = 10;

Lyliane.MP = 8;


Lyliane.statusDataDisplay();

Lyliane.useSuperMarket();


Lyliane.statusDataDisplay();

return 0;

}


プログラムの実行結果


リリアーネ

HP 10

MP 8

リリアーネはスーパーマーケットにいった

リリアーネは小豆バーをみつけた!

リリアーネのHPは10回復した!

リリアーネ

HP 20

MP 8


ソーラー「リリアーネのHPが小豆バーで


10回復している!


って


ただスーパーに買い物に行っただけのような・・・」


マックス「そう人間(Human)型のキャラクターは


スーパーマーケットにいって


小豆バーを食することにより


HPを10回復することができるのだ


ふははははははははは(´▽`*)」


てんC「確かに


ドラゴン(Dragon)型

妖精(Fairy)型のキャラクターには


ない能力ですね(^_-)-☆」



ソーラー「ところで何の話でしたっけ?


そうそう


          🌞クラスの継承🌞


をおこなうと



      😊どの様な点が便利なのかを考察するんでしたね😊


ここで


ゲーム開発が順調に進み


ゲームに登場してくる


すべてのタイプのゲームキャラクターに


新たに


APというステータスを加えたくなったとします


APとは

(Agility Point)

素早さをあらわしています


APの値が大きければ大きいほど早い順番で行動できるようになるというわけです


そのため


新たに


子クラス


Human

Dragon

Fairy

のクラス宣言に


メンバ変数宣言


int AP;


を加えることになるのですが


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

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

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


のクラス宣言に


1つずつ


メンバ変数宣言


int AP;


を付け加えるのは手間ですね


ですが


この場合


親クラスGameCharacterのクラス宣言内に


メンバ変数宣言


int AP;


を記述するだけで



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

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

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


のクラス宣言に


メンバ変数宣言


int AP;

を記述したことになります


なぜなら


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

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

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



親クラスGameCharacterの


すべてのメンバ変数宣言

すべてのメンバ関数宣言


を引き継ぐことになるからですね


さらに


APを表示するには


親クラスGameCharacterのメンバ関数statusDataDisplay()の定義を


void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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

}

から


void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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

cout << "AP " << AP << "\n";//👈ここです。メンバ変数APがもちいられています

}


に変更する必要があります


親クラスGameCharacterのメンバ関数statusDataDisplay()の定義を


変更した場合


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

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

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



親クラスGameCharacterの


すべてのメンバ変数宣言

すべてのメンバ関数宣言


を引き継ぐことになるので


変更した親クラスGameCharacterのメンバ関数statusDataDisplay()の定義

👇

void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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

cout << "AP " << AP << "\n";//👈ここです。メンバ変数APが付け加えられています

}


👆

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

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

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


のクラス宣言内で記述されていることになります


つまり


親クラスGameCharacterのメンバ関数を変更するだけで


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

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

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


内に設定されているメンバ関数に変更を加えることに相当することができるというわけです


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

👇


#include <iostream>

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

using namespace std;


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

class GameCharacter {


public:

string name;

int HP;

int MP;

int AP;

void statusDataDisplay();


//クラスGameCharacterにはuseFireRecovery(GameCharacter& a)を設定しません

};



void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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

cout << "AP " << AP << "\n";

}





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


class Human:public GameCharacter {

public:

void useSuperMarket();


};



void Human::useSuperMarket() {

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

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

HP += 10;


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


}


int main() {


Human Lyliane;


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

Lyliane.HP = 10;

Lyliane.MP = 8;

Lyliane.AP = 5;


Lyliane.statusDataDisplay();


Lyliane.useSuperMarket();


Lyliane.statusDataDisplay();


return 0;

}


プログラムの実行結果


リリアーネ

HP 10

MP 8

AP 5

リリアーネはスーパーマーケットにいった

リリアーネは小豆バーをみつけた!

リリアーネのHPは10回復した!

リリアーネ

HP 20

MP 8

AP 5


ソーラー「このプログラムの注目ポイントは


子クラスであるHumanのクラス宣言に


メンバ変数宣言


int AP;


を記述しなくても


親クラスであるGameCharacterに


メンバ変数宣言


int AP;


が記述されているので


子クラスであるHumanのクラス宣言に


メンバ変数宣言


int AP;


が記述されていなくても


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


ですので


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


Human Lyliane;


を実行して


クラスHuman型のオブジェクトLylianeを作製したときに


同時に生成される


Lyliane.AP



Lyliane.AP = 5;


と数値データを代入することができるようになります


そして


親クラスであるGameCharacterのメンバ関数statusDataDisplay()に


APを表示できるよう変更を加えたので


子クラスHuman型のオブジェクトLylianeを作製したときに


同時に生成される


子クラスHuman型のオブジェクトLylianeのメンバメソッド


Lyliane.statusDataDisplay()


を実行して


リリアーネのAP


5


をコマンドプロンプト画面に表示することができるようになったというわけです



このように


親クラスのクラスに変更を加えるだけで


親クラスを継承したすべての子クラスに変更を加えることができるようになるんです」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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