🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
親クラスから子クラスへ継承を行う際 使用できるアクセス指定子は puplic protected private の3つがあります
出題編 アクセス指定子private,public,protectedを用いてクラスの継承を行った場合 どのように親クラスのメンバ変数宣言、メンバ関数宣言は子クラスに引き継がれるのでしょうか?
親クラスから子クラスへ継承を行う際 使用できるアクセス指定子は puplic protected private の3つがあります
ソーラー「😊😊さあ、今日は どんなお話になるかな?
親クラスGameCharacter
から
子クラスDragon
へ
クラスの継承を行うには
子クラスDragonのクラス宣言の定義の
class Dragonに
:public GameCharacter
をくっつけて
class Dragon:public GameCharacter
のように記述しました。
そのときのプログラムはこちらになります。
👇
#include <iostream>
#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています
using namespace std;
//👇🌞🌞🌞クラスGameCharacterです🌞🌞🌞
class GameCharacter {
public:
string name;
int HP;
int MP;
void statusDataDisplay();
//クラスGameCharacterにはDragonタイプのキャラクターのみが使用できるuseFireRecovery(GameCharacter& a)を設定しません
};
void GameCharacter::statusDataDisplay() {
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP << "\n";
}
//👇🌞🌞🌞クラスGameCharacterを継承した子クラスDragonです🌞🌞🌞
class Dragon:public GameCharacter {
public:
void 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";
}
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
へ
クラスの継承を行っています
このとき
子クラスDragonのクラス宣言の定義の
class Dragonに
:public GameCharacter
をくっつけて
class Dragon:public GameCharacter
のように記述しました。
ここでの注目ポイントは
class Dragon:public GameCharacter
のなかの
アクセス指定子
public
なんです。」
マックス「そういや
なぜか
アクセス指定子
public
がくっついていたよな。
アクセス指定子
public
なしで
class Dragon:GameCharacter
と記述してあってもいいんじゃないか」
~ ~ ~ ~ ~ ~ ~(´▽`*)~ ~ ~ ~ ~ ~ ~
それもそうですね。
class Dragon:public GameCharacter
を
class Dragon:GameCharacter
と記述したときのプログラムを実行してみます。
#include <iostream>
#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています
using namespace std;
//👇🌞🌞🌞クラスGameCharacterです🌞🌞🌞
class GameCharacter {
public:
string name;
int HP;
int MP;
void statusDataDisplay();
//クラスGameCharacterにはDragonタイプのキャラクターのみが使用できるuseFireRecovery(GameCharacter& a)を設定しません
};
void GameCharacter::statusDataDisplay() {
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP << "\n";
}
//👇🌞🌞🌞クラスGameCharacterを継承したクラスDragonです🌞🌞🌞
class Dragon:GameCharacter {
public:
void 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";
}
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;
}
ビルド実行結果
エラー (アクティブ) E0265 関数 "GameCharacter::statusDataDisplay" (宣言された 行 19) にアクセスできません
エラー (アクティブ) E0265 関数 "GameCharacter::statusDataDisplay" (宣言された 行 19) にアクセスできません
エラー (アクティブ) E0265 メンバー "GameCharacter::name" (宣言された 行 9) にアクセスできません
エラー (アクティブ) E0265 メンバー "GameCharacter::MP" (宣言された 行 11) にアクセスできません
エラー (アクティブ) E0265 メンバー "GameCharacter::HP" (宣言された 行 10) にアクセスできません
エラー C2247 'GameCharacter::statusDataDisplay' はアクセスできません。'Dragon' は 'private' で 'GameCharacter' からの継承で使われています。
エラー C2247 'GameCharacter::statusDataDisplay' はアクセスできません。'Dragon' は 'private' で 'GameCharacter' からの継承で使われています。
エラー C2247 'GameCharacter::name' はアクセスできません。'Dragon' は 'private' で 'GameCharacter' からの継承で使われています。
エラー C2247 'GameCharacter::MP' はアクセスできません。'Dragon' は 'private' で 'GameCharacter' からの継承で使われています。
エラー C2247 'GameCharacter::HP' はアクセスできません。'Dragon' は 'private' で 'GameCharacter' からの継承で使われています。
~ ~ ~ ~ ~ ~ ~(´▽`*)~ ~ ~ ~ ~ ~ ~
マックス「
なんで
class Dragon:public GameCharacter
を
class Dragon:GameCharacter
と記述したらプログラムの実行ができない??」
てんC「不思議ですね。
明らかに
class Dragon:GameCharacter
と記述したときの方が
クラスの継承方法としては
簡潔でわかりやすいような気がします。
これはどういうことなのでしょうか?」
ソーラー「それをこれから調べていこうってわけなんだよ~。
🌞 🌞 🌞 🌞 🌞 🌞
実は のちのエピソードで詳しく語られますが
class Dragon:GameCharacter
と記述した場合は
class Dragon:private GameCharacter
が
記述されていることになります
そして
その場合
親クラスGameCharacterのメンバ変数宣言
string name;
int HP;
int MP;
親クラスGameCharacterのメンバ関数宣言
void statusDataDisplay();
は
🌞子クラスDragonのクラス宣言内に引き継がれているんです🌞
引き継がれていない
ではなく
引き継がれているんです
今のプログラムでは
親クラスGameCharacterのメンバ変数宣言
string name;
int HP;
int MP;
親クラスGameCharacterのメンバ関数宣言
void statusDataDisplay();
が
子クラスDragonのクラス宣言内に引き継がれているのですが
Pokkyの子クラスDragon型のオブジェクト宣言
Dragon Pokky;
を
実行した後
Pokky.name = "ポッキー";
Pokky.HP = 15;
Pokky.MP = 5;
Pokky.statusDataDisplay();
を実行しようとしているので
ビルドエラーが表示されています
つまり
Pokkyの子クラスDragon型のオブジェクト宣言
Dragon Pokky;
を
実行しても
Pokky.name
Pokky.HP
Pokky.MP
Pokky.statusDataDisplay()
は
生成されていないのに
Pokky.name = "ポッキー";
Pokky.HP = 15;
Pokky.MP = 5;
Pokky.statusDataDisplay();
を実行しようとしているので
ビルドエラーが表示されることになります
もし
親クラスGameCharacterのメンバ変数宣言
string name;
int HP;
int MP;
親クラスGameCharacterのメンバ関数宣言
void statusDataDisplay();
が
子クラスDragonのクラス宣言内に引き継がれていない場合
main関数内に何もプログラムを記述していなくても
子クラスDragonのメンバ関数内で
親クラスGameCharacterのメンバ変数
name
HP
MP
が記述されているだけで
プログラムの実行時
ビルドエラーが表示されることになります
🌞 🌞 🌞 🌞 🌞 🌞
親クラスGameCharacter
から
子クラスDragon
へ
クラスの継承を行う際
使用できるアクセス指定子は
puplic
protected
private
の3つあります。
つまり
親クラスGameCharacter
から
子クラスDragon
へ
アクセス指定子を使って継承を行う方法は
class Dragon:public GameCharacter
class Dragon:protected GameCharacter
class Dragon:private GameCharacter
の
3通りの方法があるというわけです。」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます