2016-06-27 1 views
-1

私は基本クラスのポインタの配列を持っていると仮定します。 この配列に派生クラスオブジェクトポインタ(その基本クラスから派生したもの)を格納できますか?私はそれを逆にすることはできますか?派生オブジェクトポインタは、基本クラスポインタの配列に格納できますか?

+0

なぜあなたはいくつかのコードを提供することによって実用的な質問をしませんか? – user463035818

+0

これは大学の試験からの理論上の質問であり、コードは提供されていないためです。 – Akra

+1

はい、 'std :: vector 'に 'Derived *'を格納できますが、その逆はできません。 – ArchbishopOfBanterbury

答えて

4

この配列に派生クラスオブジェクトポインタ(その基本クラスから派生したもの)を格納できますか?

はい。

私はそれを逆にすることはできますか?

あなたが持っていると言う:

struct Base 
{ 
}; 

struct Derived1 : Base 
{ 
}; 

struct Derived2 : Base 
{ 
}; 

std::vector<Derived1*> ptrs; 
Base* bPtr = new Derived2; 
ptrs.push_back(bPtr);  // Not allowed. 
          // If it were, imagine the problems. 
          // You have a Derived2* in the guise of a Derived1* 
+0

私派生クラスに追加のパブリック関数があっても実行できますか? – Akra

+1

できます。ただし、派生クラスのメンバには、基本クラスのポインタを使用してアクセスすることはできません。派生したクラスメンバにアクセスするには、ポインタを最初に派生クラスのポインタにキャストする必要があります。 –

3

あなたが実際にBase*の配列(またはそのことについてBaseポインタの他のデータ構造)にDerived*を保存することができます。

しかし、逆の場合は、Liskov Substitution Principleに違反しているため、真ではありません。

関連する問題