2012-12-19 4 views
6

私は以下のクラスがある場合:のinstanceof ++(ないポインタ)

class Object { ... } 

class MyClass1: public Object { ... } 

class MyClass2: public Object { ... } 

とスタック:std::stack<Object> statesObjects;

MyClass1 c1; 
MyClass2 c2; 

statesObjects.push(c1); // okay 
statesObjects.push(c2); // okay 

どのように私はそれらを飛び出しにある要素を取得することができますがスタックの先頭(top())にはdynamic_castが付いていません。私はここでポインタを使っていませんか?

答えて

8

同様に、元のクラスでの短い答えは、あるとしてあなたのスタックであなたが飛び出すことができないということであり、派生クラス型要素としての要素それらをスタックに入れて、をスタックの要素クラスにスライスしてにします。つまり、その基本クラス部分だけがスタックにコピーされています。

あなたはしかし、ポインタのスタックを持つことができ、その後、あなたはdynamic_castは、静的に既知のクラスには、少なくとも1つのvirtualメンバ関数を持っていることを提供、または標準が言うように、静的に既知のクラスは多型であることを提供する使用することができます。

しかし、Javaのようなダウンキャストの代わりに、は、共通基本クラスの仮想関数を使用します。しばしば、それは直接そのような機能を持つように働く。もっと複雑なシナリオの場合は、訪問者パターン(google it)をで使用する必要があるかもしれませんが、基本的には、仮想関数は“安全な”の安全な方法でダウンキャストの効果を達成します。

+0

助けてくれてありがとう。 – ron

2

クラスに派生クラスオブジェクトを格納しているように見える場合でも、格納されるのはオブジェクトの基本クラス部分だけです。要するに、オブジェクトスライシングを取得します。

要約すると、このコンテナに派生クラスオブジェクトを格納することはできません。あなたはconainterの型としてBaseへのポインタを格納し、これを達成するために動的多型を使用する必要があります。

グッド読む:
What is object slicing?

関連する問題