2013-05-04 10 views
5

このコードはなぜ機能しませんか?dynamic_pointer_castを使用しているときに動的キャストできません。

std::shared_ptr<Event> e = ep->pop(); 
std::shared_ptr<TrackerEvent> t; 

t = std::dynamic_pointer_cast<TrackerEvent>(e); 

は、私は次のエラーを取得する:Eventから

/usr/include/c++/4.6/bits/shared_ptr.h:386: error: cannot dynamic_cast '(& __r)->std::shared_ptr<Event>::<anonymous>.std::__shared_ptr<_Tp, _Lp>::get [with _Tp = Event, __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]()' (of type 'class Event*') to type 'class TrackerEvent*' (source type is not polymorphic) 

TrackerEvent継承ので、私は、問題は、私はこの方向にキャストすることができないということですね。しかしep->pop()は、EventまたはTrackerEventのオブジェクトを返すことがあります。そして私は...私はTrackerEventにキャストしようと、それはNULLを返すとき、私はEventまたはTrackerEventを持っているかどうか、私は知っているだろうと期待していた

私はそれをどのように行うのでしょうか?

+3

あなたがする必要がありますdynmaic_castを使用するための少なくとも1つの仮想メソッドがあります。 – stardust

答えて

10

コンパイラがメッセージの最後に何が起こっているか、あなたが言っている:

(source type is not polymorphic)

あなたEvent基底クラスには、少なくとも1つのvirtualメンバ関数を持っている必要があります(つまり多様型こと)に動的キャストを可能にする。あなたはEventのデストラクタが仮想作ることができます:ここで

class Event 
{ 
public: 
    virtual ~Event() { /* whatever goes here, or nothing... */ } 
    // ... 
}; 

は、コードのコンパイル(仮想デストラクタを削除すると、コンパイルエラーsimilar to the one you are seeingを引き起こす)ことを示し、live example with polymorphic typesです。正しくコメントでLuc Dantonで言及

(あなたのコンパイラは、この点でC++ 11に準拠している場合)、仮想デストラクタの不履行バージョンはこのように定義することができます:

class Event 
{ 
public: 
    virtual ~Event() = default; 
    // ... 
}; 
+0

@LucDanton:そうですね、それを言い忘れました。編集されました、ありがとう –

3

dynamic_castを実行するには、キャスト元の型がポリモフィックである必要があります。これが真実であるためには、いくつかの仮想メンバを持つか継承する必要があります。 Eventに仮想メンバ関数(少なくとも仮想デストラクタ)があることを確認してください。

関連する問題