2012-05-09 34 views
2

在這裏,第二投給了一個錯誤,說動態強制轉換不適用於非多態基類嗎?

cast.cc:35:35: error: cannot dynamic_cast ‘base’ (of type ‘class CBase*’) to type ‘class CDerived*’ (source type is not polymorphic)

CBase * base = new CDerived; 
    CBase* pb; 
    CDerived * der = new CDerived; 
    CDerived* pd; 
    pb = dynamic_cast<CBase*>(der);  // ok: derived-to-base 
    pd = dynamic_cast<CDerived*>(base); // wrong: base-to-derived 

什麼是這個meannt?

爲什麼這個工作,如果我讓基類多態?

有人可以讓我知道背後的基本概念。

回答

6

由於標準是這樣說的(參照C++標準段[expr.dynamic.cast]):

... dynamic_cast<T>(v)

... v應的指針或一個多態型

在實踐中的左值,因爲所要求的run-time type information (RTTI)進行動態(衍生即,從基)下鑄件可能與而產生0,如果沒有多態成員函數,這不是必需的。

另一方面,上行(即派生到基地)不需要RTTI(沒有運行時決策)。從標準的同款報價:

struct B { }; 
struct D : B { }; 
void foo(D* dp) { 
    B* bp = dynamic_cast<B*>(dp); // equivalent to B* bp = dp; 
} 
+1

該編譯器替代一個的static_cast爲dynamic_cast的時候就知道這是一個派生於基轉換?這就是你所暗示的,對吧? –

+1

@MarkRansom:我想這就是我所暗示的,但我不打算明確說明,以防萬一它錯了! –