横から失礼。
LisetteLander さんが書きました:C++の知識が乏しいのでよくわからないですが、
PosGettableから継承したEnemyクラスはPosGettableのインスタンスを持っているって事で、
マネージャークラスはEnemyクラスからPosGettableの成分だけポインタだけ取り出せるって事ですか?
継承というのはEnemyクラスのメンバにPosGettableのメンバが追加されるだけ・・って思ってたのですが・・・
継承の概念は、AがBを継承している場合、「A is a B」となり、これをis-a関係とか言うことが多いです。
なんぞそれ、っていうと、ようは「AはB」なんです。この場合、
EnemyクラスはPosGettableクラスなんです。
意味分かんないですかね。
>継承というのはEnemyクラスのメンバにPosGettableのメンバが追加されるだけ
というよりは
「継承というのはEnemyクラスをPosGettableクラスとして扱うことができるようになる」
のです。そしてこの理由は
「EnemyクラスはPosGettableクラスだから(is-a)」
です。
継承のイメージは「機能(メンバ)を引き継ぐ」→「つまり継承したクラスは継承されたクラスの機能を持っているのだから、継承元と同様に扱ってもいいよね」
みたいな感じでいいと思います。
具体的にこの必要はあるのか?という点について。
コード:
class A
{
int Hp;
public:
int getHp() const{ return this->Hp; }
};
class B
:public A
{
public:
void Hoge();
};
というコードがあったとして
PosGettableから継承したEnemyクラスはPosGettableのインスタンスを持っているって事で、
マネージャークラスはEnemyクラスからPosGettableの成分だけポインタだけ取り出せるって事ですか?
ではなく、
継承したクラスは継承されたクラスの機能を持っているのだから、継承元と同様に扱ってもいいので、
BのポインタをAのポインタ変数に入れられます。
Aのポインタからは、Aの持つインターフェイス(getHP)しか触れない。つまりAに入れるとHogeは使えない。
コードにするとこんな感じ。
コード:
void Test(){
B instans; // B型のインスタンス
A* pointer; // A型のポインタ
pointer = &instans; // 継承したクラスは継承されたクラスの機能を持っているのだから、継承元と同様に扱ってもいいので、BのポインタをAのポインタ変数に入れられます。
pointer->getHp(); // OK
pointer->Hoge(); // Error!! AからはHogeは使えない
}
これ管理人様のおっしゃっている、
情報が欲しいクラスからそれが参照出来るようにすれば安全で、広い範囲から情報が取得できるかと思います。
を実装するのにピッタリだと思いません?
厳密に言えば
「情報が欲しいクラスからそれ
だけが参照出来るようにすれば安全で、広い範囲から情報が取得できるかと思います。」
つまり、
「情報が欲しいクラスに、EnemyクラスをPosGettableクラス型のポインタに入れて教えてあげれば、座標だけ教えられるよね?他のは触れないもん、だってPosGettableクラス型なんだから」
ってことです。
継承というのはEnemyクラスのメンバにPosGettableのメンバが追加されるだけ
というのは、まぁ完全に間違ってるかって言うとコレも結果的な事実ではありますが、よくない設計のもとになるかと思います。