🌻天国にいけるC++言語入門🌻 進化し続けるオブジェクト指向プログラミング ver3.2307
🍎class Dragon:private GameCharacter🍎と🍊class Dragon:protected GameCharacter🍊の継承について詳しく調べてみましょう
🍎class Dragon:private GameCharacter🍎と🍊class Dragon:protected GameCharacter🍊の継承について詳しく調べてみましょう
🌞つづきです🌞
ソーラー「となると
🍎class Dragon:private GameCharacter🍎
と
🍊class Dragon:protected GameCharacter🍊
の継承の違いとはなんでしょうか?
ってなるよね😊
🌞🌞🌞親クラスのクラス宣言が🌞🌞🌞
👇
class GameCharacter {
public://👈ここに注目 アクセス指定子がpublicに設定されています
string name;
int HP;
int MP;
void statusDataDisplay();
};
👆
のように設定されているとします
親クラスGameCharacterのメンバ変数宣言
string name;
int HP;
int MP;
親クラスGameCharacterのメンバ関数宣言
void statusDataDisplay();
のアクセス指定子は
🌞public🌞
に設定されています
この状態で
親クラスGameCharacter
から
子クラスDragon へ
クラスの継承を
🌞🌞アクセス指定子publicを用いて行った場合🌞🌞
👇
親クラスGameCharacterのメンバ変数宣言
string name;
int HP;
int MP;
親クラスGameCharacterのメンバ関数宣言
void statusDataDisplay();
👆
は
🌞🌞アクセス指定子public🌞🌞
が付けられた状態の
👇
public:
//👆🌞🌞🌞アクセス指定子publicが設定されていることに大注目🌞🌞🌞
string name;
int HP;
int MP;
void statusDataDisplay();
👆
として
子クラスDragon に引き継がれます
親クラスGameCharacter
から
子クラスDragon へ
クラスの継承を
🌞🌞アクセス指定子publicを用いて行った場合🌞🌞
🌞🌞🌞クラスGameCharacterを継承した子クラスDragonのクラス宣言🌞🌞🌞は以下のように記述されます
👇
class Dragon:public GameCharacter {
public:
void statusDataDisplay2(string a, int b, int c);
};
👆
この親クラスGameCharacterを継承した子クラスDragonのクラス宣言には
見えていないだけで
アクセス指定子publicが付けられた状態で
親クラスGameCharacterのメンバ変数宣言
string name;
int HP;
int MP;
親クラスGameCharacterのメンバ関数宣言
void statusDataDisplay();
が引き継がれています
例えば
次のような感じです
class Dragon:public GameCharacter {
public://🌞🌞🌞アクセス指定子publicが設定されていることに大注目🌞🌞🌞
string name;
int HP;
int MP;
void statusDataDisplay();
public:
void statusDataDisplay2(string a, int b, int c);
};
次に
親クラスGameCharacter
から
子クラスDragon へ
クラスの継承をアクセス指定子protectedを用いて行ったとします
その際
🌞🌞🌞クラスGameCharacterを継承した子クラスDragonのクラス宣言🌞🌞🌞は以下のようになります
👇
class Dragon:protected GameCharacter {
public:
void statusDataDisplay2(string a, int b, int c);
};
このクラスGameCharacterを継承した子クラスDragonのクラス宣言には
見えていないだけで
アクセス指定子protectedが付けられた状態で
親クラスGameCharacterのメンバ変数宣言
string name;
int HP;
int MP;
親クラスGameCharacterのメンバ関数宣言
void statusDataDisplay();
が引き継がれています
例えば
次のような感じです
👇
class Dragon:protected GameCharacter {
protected://🌞🌞🌞アクセス指定子protectedが設定されていることに大注目🌞🌞🌞
string name;
int HP;
int MP;
void statusDataDisplay();
public:
void statusDataDisplay2(string a, int b, int c);
};
親クラスGameCharacter
から
子クラスDragon へ
クラスの継承を
🌞🌞アクセス指定子protectedを用いて行った場合🌞🌞
👇
親クラスGameCharacterのメンバ変数宣言
string name;
int HP;
int MP;
親クラスGameCharacterのメンバ関数宣言
void statusDataDisplay();
👆
は
🌞🌞アクセス指定子protected🌞🌞
が付けられた状態の
👇
protected://🌞🌞🌞アクセス指定子protectedが設定されていることに大注目🌞🌞🌞
string name;
int HP;
int MP;
void statusDataDisplay();
👆
として
子クラスDragonに引き継がれています
仕組みはとても単純ですね」
マックス「おおんん、これは簡単」
ソーラー「
ところで前のエピソードでも学びましたが
子クラスDragonのメンバ変数宣言のアクセス指定子が
このように
👇
protected://🌞🌞🌞アクセス指定子protectedが設定されていることに大注目🌞🌞🌞
string name;
int HP;
int MP;
👆
protectedになっていると
main関数内で
Pokkyの子クラスDragon型のオブジェクト宣言
Dragon Pokky;
を実行して
子クラスDragon型のオブジェクトPokkyを作製したとき
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
は生成されないので
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
を使用することはできず
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
に
直接
データを代入することはできませんが
子クラスDragon型のオブジェクトPokkyのメンバ関数を用いて
間接的に
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
に
データを代入することができましたね
同様に
継承関係にない他のクラス(のメンバ関数)内で
Pokkyの子クラスDragon型のオブジェクト宣言
Dragon Pokky;
を実行して
子クラスDragon型のオブジェクトPokkyを作製したとき
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
は生成されないので
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
を使用することはできず
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
に
直接
データを代入することはできませんが
子クラスDragon型のオブジェクトPokkyのメンバ関数を用いて
間接的に
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
に
データを代入することができます
おまけでした
次に
親クラスGameCharacter
から
子クラスDragon へ
クラスの継承を
🌞🌞アクセス指定子privateを用いて行った場合🌞🌞
👇
親クラスGameCharacterのメンバ変数宣言
string name;
int HP;
int MP;
親クラスGameCharacterのメンバ関数宣言
void statusDataDisplay();
👆
は
🌞🌞アクセス指定子private🌞🌞
が付けられた状態の
👇
private://🌞🌞🌞アクセス指定子privateが設定されていることに大注目🌞🌞🌞
string name;
int HP;
int MP;
void statusDataDisplay();
👆
が
子クラスDragon に引き継がれます
親クラスGameCharacter
から
子クラスDragon へ
クラスの継承を
🌞🌞アクセス指定子privateを用いて行った場合🌞🌞
🌞🌞🌞クラスGameCharacterを継承した子クラスDragonのクラス宣言🌞🌞🌞は以下のようになります
👇
class Dragon:private GameCharacter {
public:
void statusDataDisplay2(string a, int b, int c);
};
👆
この親クラスGameCharacterを継承した子クラスDragonのクラス宣言には見えていないだけで
アクセス指定子privateがつけられた
親クラスGameCharacterのメンバ変数宣言
string name;
int HP;
int MP;
親クラスGameCharacterのメンバ関数宣言
void statusDataDisplay();
が引き継がれています
例えば
次のような感じです
class Dragon:private GameCharacter {
private://🌞🌞🌞アクセス指定子privateが設定されていることに大注目🌞🌞🌞
string name;
int HP;
int MP;
void statusDataDisplay();
public:
void statusDataDisplay2(string a, int b, int c);
};
アクセス指定子がclass Dragon:private GameCharacterのように
privateに設定されていても
💖継承自体はおこなわれているというわけです💖
ですが
main関数内で
子クラスDragon型のオブジェクト宣言
Dragon Pokky;
を実行して
子クラスDragon型のオブジェクトPokkyを作製しても
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
は生成されません
ですので
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
に
直接
データを代入することはできません
親クラスGameCharacterのメンバ変数宣言
string name;
int HP;
int MP;
を
継承することと
main関数内で
子クラスDragon型のオブジェクト宣言
Dragon Pokky;
を実行して
子クラスDragon型のオブジェクトPokkyを作製したとき
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
が生成されるかどうかは
😊別問題😊
なんだね
親クラスGameCharacterのメンバ変数宣言のアクセス指定子が
このように
👇
public://🌞🌞🌞アクセス指定子publicが設定されていることに大注目🌞🌞🌞
string name;
int HP;
int MP;
👆
publicになっている状態で
class Dragon:private GameCharacterのように
アクセス指定子privateを使ってクラスの継承を行うと
子クラスDragonのクラス宣言内には
このように
👇
class Dragon:private GameCharacter {
private://🌞🌞🌞アクセス指定子privateが設定されていることに大注目🌞🌞🌞
string name;
int HP;
int MP;
void statusDataDisplay();
public:
void statusDataDisplay2(string a, int b, int c);
};
👆
アクセス指定子がprivateになっている状態で親クラスGameCharacterのメンバ変数宣言が
記述されていることになります
この場合
main関数内で
Pokkyの子クラスDragon型のオブジェクト宣言
Dragon Pokky;
を実行して
子クラスDragon型のオブジェクトPokkyを作製しても
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
は生成されないので
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
に
直接
データを代入することはできませんが
子クラスDragon型のオブジェクトPokkyのメンバ関数
statusDataDisplay2(string a, int b, int c)をもちいて
間接的に
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
に
データを代入することができます
そのプログラムはこちらです
👇
#include <iostream>
#include <string>//文字列を取り扱うためにヘッダファイル <string>をインクルードしています
using namespace std;
//👇🌞🌞🌞クラスGameCharacterです🌞🌞🌞
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を継承したクラスDragonです🌞🌞🌞
class Dragon :private GameCharacter {
public:
void statusDataDisplay2(string a, int b, int c);
};
void Dragon::statusDataDisplay2(string a, int b, int c) {
name = a;
HP = b;
MP = c;
cout << name << "\n";
cout << "HP " << HP << "\n";
cout << "MP " << MP << "\n";
}
int main() {
Dragon Pokky;
Pokky.statusDataDisplay2("ポッキー", 15, 5);
return 0;
}
ビルド実行結果
ポッキー
HP 15
MP 5
そして
class Dragon:private GameCharacterのように
継承を行った場合
同様に
継承関係にない他のクラス(のメンバ関数)内で
Pokkyの子クラスDragon型のオブジェクト宣言
Dragon Pokky;
を実行して
子クラスDragon型のオブジェクトPokkyを作製したとき
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
は生成されないので
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
を使用することはできず
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
に
直接
データを代入することはできませんが
子クラスDragon型のオブジェクトPokkyのメンバ関数を用いて
間接的に
子クラスDragon型のオブジェクトPokkyのメンバ変数
Pokky.name
Pokky.HP
Pokky.MP
に
データを代入することができます
おまけでした
マックス「おお これが
🍎アクセス指定子privateをもちいて🍎
class Dragon:private GameCharacterのように
クラスの継承を行った場合と
🍊アクセス指定子protectedをもちいて🍊
class Dragon:protected GameCharacterのように
クラスの継承を行った場合
の違いってわけかあ
って
違いはないじゃないか~~~~~い
たんに
🍎アクセス指定子privateをもちいて🍎
class Dragon:private GameCharacterのように
クラスの継承を行った場合では
親クラスGameCharacterのメンバ変数宣言は
string name;
int HP;
int MP;
のアクセス指定子が
privateに変更された状態で
子クラスDragonのクラス宣言内に引き継がれ
🍊アクセス指定子protectedをもちいて🍊
class Dragon:protected GameCharacterのように
クラスの継承を行った場合
親クラスGameCharacterのメンバ変数宣言は
string name;
int HP;
int MP;
のアクセス指定子が
protectedに変更された状態で
子クラスDragonのクラス宣言内に引き継がれるってだけで
何の違いもない?
なんだ
もうぅ 簡単じゃないか?」
ソーラー「てへぺろ
そうなんです
ただ単に
親クラスのメンバ変数宣言のアクセス指定子が
public
に設定された状態で
class Dragon:public GameCharacterのように
継承を行った場合は
親クラスGameCharacterのメンバ変数宣言のアクセス指定子は
publicからpublic
に書き換えられた状態で
子クラスDragonに引き継がれ
親クラスのメンバ変数宣言のアクセス指定子が
public
に設定された状態で
class Dragon:private GameCharacterのように
継承を行った場合は
親クラスGameCharacterのメンバ変数宣言はアクセス指定子は
publicからprivate
に書き換えられた状態で
子クラスDragonに引き継がれ
親クラスGameCharacterのメンバ変数宣言のアクセス指定子が
public
に設定された状態で
class Dragon:protected GameCharacterのように
継承を行った場合は
親クラスGameCharacterのメンバ変数宣言のアクセス指定子は
publicからprotected
に書き換えられた状態で
子クラスDragonに引き継がれるというわけです
ただし
親クラスのメンバ変数宣言のアクセス指定子が
public
でなく
private
protected
の場合は
ちょっとだけお話が変わってきますが
同じようなネタで
仕組みはとても簡単です」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます