クラスの継承  一部のクラスを変更するだけで簡単に全体のクラスを変更することができるようになります

クラスの継承前夜 一部のクラスを変更するだけで簡単に全体のクラスを変更することができるようになります

ソーラー「再び


クラスGameCharacter



クラスDragonが用いられた次のプログラムをご覧ください」

👇


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

}



//👇🌞🌞🌞クラスDragonのクラス宣言です🌞🌞🌞

class Dragon {


public:

string name;

int HP;

int MP;


void statusDataDisplay();


void useFireRecovery(GameCharacter& a);


};



void Dragon::statusDataDisplay() {


cout << name << "\n";

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

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

}


void Dragon::useFireRecovery(GameCharacter& a) {

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

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


a.HP += 10;


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


}



int main() {


GameCharacter Lyliane;


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

Lyliane.HP = 10;

Lyliane.MP = 8;


Dragon Pokky;

Pokky.name = "ポッキー";

Pokky.HP = 15;

Pokky.MP = 5;


Lyliane.statusDataDisplay();

Pokky.statusDataDisplay();


Pokky.useFireRecovery(Lyliane);


Lyliane.statusDataDisplay();

Pokky.statusDataDisplay();



return 0;

}


プログラムの実行結果


リリアーネ

HP 10

MP 8

ポッキー

HP 15

MP 5

ポッキーは灼熱のフレアをリリアーネに吐いた!

リリアーネは灼熱のフレアを受け燃え上がった!

リリアーネの体力は10回復した

リリアーネ

HP 20

MP 8

ポッキー

HP 15

MP 5


ソーラー「このときの


クラスGameCharacter



クラスDragon


のクラス宣言に御注目下さい」

👇


//👇🌞🌞🌞クラスGameCharacterのクラス宣言です🌞🌞🌞

class GameCharacter {


public:

string name;

int HP;

int MP;


void statusDataDisplay();


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

};

//👆🌞🌞🌞クラスGameCharacterのクラス宣言です🌞🌞🌞






//👇🌞🌞🌞クラスDragonのクラス宣言です🌞🌞🌞

class Dragon {


public:

string name;

int HP;

int MP;


void statusDataDisplay();


void useFireRecovery(GameCharacter& a);


};

//👆🌞🌞🌞クラスDragonのクラス宣言です🌞🌞🌞


ソーラー「この2つのクラスの


メンバ変数宣言

メンバ関数宣言に御注目下さい


とくに


string name;

int HP;

int MP;


void statusDataDisplay();


です」



マックス「よくみると


GameCharacterのクラス宣言でも

Dragonのクラス宣言でも


       😊全く同じ😊


メンバ変数宣言


string name;

int HP;

int MP;


メンバ関数宣言


void statusDataDisplay();


設定されているじゃないか


しかし、プログラムはビルドエラーになることもなく


実行できている?」


ソーラー「そうなんです


この


クラスGameCharacter

クラスDragon

のように


クラスが異なっていれば


 同じ名前の変数名、関数名を使用することができます


ちょうど


自作関数内と


main関数内で


つまり


異なる関数内で


同じ名前の変数名が用いられても


それぞれ


異なる変数とみなされるのと一緒です


そして


よくみると


GameCharacterのクラス宣言に


メンバ関数宣言


void useFireRecovery(GameCharacter& a);」


を付け加えたものが


Dragonのクラス宣言なんです」


マックス「めっちゃ 構造がにているな」


ソーラー「通常 


ゲームに登場してくるゲームキャラクター(GameCharacter)



すべて


name(名前)

HP

MP

のデータをもっています


ですので

クラスGameCharacterには


それらのデータを取り扱うための


メンバ変数宣言

string name;

int HP;

int MP;


が必要ですし


それらゲームキャラクターのデータをコマンドプロンプト画面に表示する必要があるため

メンバ関数宣言

void statusDataDisplay();


必要です


そして


ドラゴン(Dragon)もゲームキャラクターの1種で


ゲームキャラクターに違いはないので


name(名前)

HP

MP

のデータをもっています


ですので

クラスDragonには


それらドラゴンのデータを取り扱うための


メンバ変数宣言

string name;

int HP;

int MP;


が必要ですし


それらのデータをコマンドプロンプト画面に表示する必要があるため

メンバ関数宣言

void statusDataDisplay();


必要です



だから

GameCharacter のクラス宣言

Dragonのクラス宣言



似てくるのですね


しかも


それだけでは( ̄ー ̄)ニヤリ ないんだ(^_-)-☆


妖精(Fairy)も

人間(Human)も

エルフ(Elf)も

ドワーフも

(英語: dwarf [dwˈɔɚf]、ドイツ語: Zwerg、古ノルド語: dvergr)は、人間よりも少し背丈の小さい伝説上の種族。民話、神話、童話、ファンタジー作品などに登場することが多い。高度な鍛冶や工芸技能をもつとされており、外観は男女共に背丈が低いものの力強く屈強で、特に男性はその多くで長い髭をたくわえているとされる。

                   


                 ウィキペディアより

ホビットも


(ホビット(Hobbit)は、J・R・R・トールキンの創作した架空世界中つ国の種族。『ホビットの冒険』で初めて登場し、『指輪物語』でも重要な役割を果たした。

ホビットは、身長2 - 4フィート(60 - 121cm)で、わずかに尖った耳をもつ。足裏の皮が厚く、毛に覆われているので、靴をはくことはない。かれらは、冒険的でない牧歌的な暮らし、すなわち農耕・食事・社会生活を好む。ホビットは人間より若干長い寿命を持ち、しばしば120歳まで生きた(平均寿命100歳)。33歳で成人し、50歳で中年となる。ホビットたちは、トールキンのインスピレーションである英国の田舎の人々と同様、酒場でエールを飲むことを好む。中つ国のなかでもホビットらが住む地域の名としてトールキンが選んだ"the Shire"(ホビット庄)という名前からは、イングランドの「州(Shire)」をはっきり連想することができる。(イングランドの州も参照)


平和と食事を何よりも愛し、たいてい太っている。贈り物をするのもされるのも喜び、食べ物を例えに出すことを好む。しかしいざとなると驚くべき芯の強さを見せる。目が良いので石投げと弓矢の扱いが上手い。)

               


                 ウィキペディアより


👆

すべて

ゲームキャラクターの1種、ゲームキャラクターには違いないので


name(名前)

HP

MP

のデータをもっています」


マックス「ほう、ホビットはそ~言う種族なのか


そりゃあ、そうだろう」



ソーラー「


もし


クラス

Fairy

Human

Elf

Dwarf

Hobbit

を創設して

妖精(Fairy)

人間(Human)

エルフ(Elf)

ドワーフ(Dwarf)

ホビット(Hobbit)

タイプのゲームキャラクターの

name(名前)

HP

MP

のデータを取り扱うとしても


クラス

Fairy

Human

Elf

Dwarf

Hobbit

には


メンバ変数宣言

string name;

int HP;

int MP;


は必要ですし


それらのデータをコマンドプロンプト画面に表示する必要があるから


メンバ関数宣言

void statusDataDisplay();


必要です


先のエピソードでも登場した

クラスFairyを再度考察してみましょう

👇


//👇🌞🌞🌞クラスFairyのクラス宣言です🌞🌞🌞

class Fairy{


public:

string name;

int HP;

int MP;


void statusDataDisplay();


void useFeatherWindHealing(GameCharacter& a);

//👆フェザーウィンドヒーリングを行うための妖精クラス特有のメンバ関数です


};


👆


やはり


メンバ変数宣言

string name;

int HP;

int MP;


それらのデータをコマンドプロンプト画面に表示する必要があるから

メンバ関数宣言

void statusDataDisplay();



記述されています


となると・・・ 


同じ

メンバ変数宣言

string name;

int HP;

int MP;


メンバ関数宣言

void statusDataDisplay();



備えた


クラス

Fairy

Human

Elf

Dwarf

Hobbit

などなど

たくさん登場してくることになります」


マックス「うん まあ そうなるだろうな(´▽`*)」


ソーラー「ところで


ゲームキャラクターに


名前

HP

MP

以外に

AP(素早さ)

というものを与えたいとします


ゲームキャラクターに


AP(素早さ)


というパラメータを設定することにより


AP(素早さ)の大きいキャラクターは


他のAP(素早さ)の小さいキャラクターより早い順番で行動できるようになります


ゲームに戦略性が増し、より面白くなるというわけです


(仕様の変更というわけです  solarplexussより)


となると


今までの


クラスGameCharacterのクラス宣言は


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

class GameCharacter {


public:

string name;

int HP;

int MP;


void statusDataDisplay();


};


でしたが


今度は

ゲームキャラクターの


AP(素早さ)

を取り扱うために

以下のように

クラスGameCharacterにメンバ変数宣言

int AP;


を付け加えることになります


👇

class GameCharacter {


public:

string name;

int HP;

int MP;

int AP;//👈ここです

void statusDataDisplay();


};


ソーラー「そして


APを表示するために


メンバ関数宣言

void statusDataDisplay();


の定義を以下のように変更することになります

👇

void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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

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



}




マックス「まあ そうだよなあ(*^_^*)」


ソーラー「そうなると


クラス

Fairy

Human

Elf

Dwarf

Hobbit


にも


メンバ変数宣言


int AP;


を付け加えることになり


これまた備わっている


メンバ関数宣言

void statusDataDisplay();


の定義を以下のように変更することになります

👇

void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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

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



}





マックス「ぬぬ ぬぅあにい~~」





             30分後・・・・・



マックス「はあっはあっ


クラス

Fairy

Human

Elf

Dwarf

Hobbit


にも


全部


メンバ変数宣言


int AP;


を付け加えて


メンバ関数の定義を変更したぞ」


ソーラー「大変です マックス



今度は


ゲームキャラクターに


名前

HP

MP

AP(素早さ)

以外に

DP(防御力)


というものを与えることになりました」


マックス「ほえぇっ」


ソーラー「


ゲームキャラクターに


DP(防御力)


というパラメータを設定することにより


DP(防御力)の大きいキャラクターは


攻撃を受けてもHPが減りにくくなるというわけです


ゲームに戦略性が増し、より面白くなるというわけです」


(さらなる仕様の変更というわけです   solarplexussより)


マックス「いいじゃん DP(防御力)を設定せんでも」


てんC「くすっ」


ソーラー「


となると


今までの


クラスGameCharacterのクラス宣言は


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

class GameCharacter {


public:

string name;

int HP;

int MP;

int AP;

void statusDataDisplay();


};


でしたが


今度は

ゲームキャラクターの


DP(防御力)

を取り扱うために

以下のように

クラスGameCharacterにメンバ変数宣言

int DP;


を付け加えることになります



👇

class GameCharacter {


public:

string name;

int HP;

int MP;

int AP;

int DP;

void statusDataDisplay();


};



そして


これまた備わっている


メンバ関数宣言

void statusDataDisplay();


の定義を以下のように変更することになります

👇

void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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

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

cout << "DP " << DP << "\n";



}



ソーラー「そうなると


クラス

Fairy

Human

Elf

Dwarf

Hobbit


にも


メンバ変数宣言


int DP;


を付け加えることになります


そして


これまた備わっている


メンバ関数宣言

void statusDataDisplay();


の定義内容を以下のように変更することになります

👇



cout << name << "\n";

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

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

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

cout << "DP " << DP << "\n";





マックス「えびぃ」




             38分後・・・・・



マックス「はあっはあっ・・・


なんとか


クラス

Fairy

Human

Elf

Dwarf

Hobbit


にも


全部


メンバ変数宣言


int DP;


を付け加えて


メンバ関数を変更したぞ」



ソーラー「大変です マックス


今度は


ゲームキャラクターに


名前

HP

MP

AP(素早さ)

DP(防御力)

以外に

STR(力の強さ)

というものを与えることになりました


マックス「ちょっ・・・」


ソーラー「


ゲームキャラクターに


STR(力の強さ)


というパラメータを設定することにより


STR(力の強さ)の大きいキャラクターは


攻撃力が高く相手のHPをより大きく減らすことができるというわけです


ゲームに戦略性が増し、より面白くなるというわけです」


(さらなるさらなる仕様の変更というわけです   solarplexussより(#^.^#))



マックス「そういうことは


最初っから計画しとかんかぁ~い」


てんC「うふっ」


ソーラー「


となると


今までの


クラスGameCharacterのクラス宣言は


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

class GameCharacter {


public:

string name;

int HP;

int MP;

int AP;

int DP;

void statusDataDisplay();


};


でしたが


今度は

ゲームキャラクターの


STR(力の強さ)

を取り扱うために

以下のように

クラスGameCharacterにメンバ変数宣言

int STR;


を付け加えることになります


👇

class GameCharacter {


public:

string name;

int HP;

int MP;

int AP;

int DP;

int STR;


void statusDataDisplay();


};


そして


これまた備わっている


メンバ関数宣言

void statusDataDisplay();


の定義を以下のように変更することになります」

👇

void GameCharacter::statusDataDisplay() {


cout << name << "\n";

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

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

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

cout << "DP " << DP << "\n";

cout << "STR " << STR << "\n";


}






ソーラー「そうなると


クラス

Fairy

Human

Elf

Dwarf

Hobbit


にも


メンバ変数宣言


int STR;


を付け加えることになります


そして


これまた備わっている


メンバ関数宣言

void statusDataDisplay();


の定義内容を以下のように変更することになります」

👇



cout << name << "\n";

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

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

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

cout << "DP " << DP << "\n";

cout << "STR " << STR << "\n";





マックス「ちょ・・・ちょっと


こんなことやってたら きりがないではないか」


ソーラー「そうなんです


このように


 実際のゲーム開発では


次々と


仕様の変更 追加がおこるんじゃないかな? 


と思われます」


マックス「な、なるほど


それでゲームの発売予定日が延期されたりするわけか・・・



こ、この



   💖💖💖一部のクラスの内容を変更したら💖💖💖


 💖💖💖他の全部のクラスの内容を手作業で変更💖💖💖


というのはなんとかならないんか~~~~~~~~~~~~~~~~~~~~~あああああいぃぃぃぃ~~~~~~~~~~~~~~~~~~~~~


                                    」



ソーラー「さらに


class GameCharacter {


public:

string name;

int HP;

int MP;

int AP;

int DP;

int STR;


void statusDataDisplay();


};



int AP;



int SP;


に変更してほしいとのことです



APよりSPのほうがスピードポイント


と読めるということで


素早さをあらわしているのがユーザーにも理解しやすいとの意見があったからです」



(さらなるさらなるさらなる仕様の変更というわけです\(^o^)/   solarplexussより)



マックス「・・・ということは・・・


クラス

Fairy

Human

Elf

Dwarf

Hobbit

メンバ変数宣言

int AP;

全部

int SP;

に変更ってことか~~~~~~~~


のおおおっぉぉんん」

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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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