2

ここで、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

これはどういう意味ですか??

そして、基本クラスをポリモーフィックにすると、なぜこれが機能するのでしょうか?

この背後にある基本的な概念を教えてください。

4

1 に答える 1

5

標準にそう記載されているため (C++ 標準のセクション [expr.dynamic.cast] を参照):

...dynamic_cast<T>(v)

...vへのポインタまたは多相型の左辺値でなければなりません

実際には、動的なダウン キャスト (つまり、ベースから派生物へ) を可能にするために必要なランタイム型情報 (RTTI)がvtbl/vptr メカニズムと共に生成されるため、ポリモーフィック メンバー関数がない場合は必要ありません。 .

一方、アップキャスト (つまり、ベースに派生) は、RTTI を必要としません (実行時に決定する必要はありません)。標準の同じセクションからの引用:

struct B { };
struct D : B { };
void foo(D* dp) {
    B* bp = dynamic_cast<B*>(dp); // equivalent to B* bp = dp;
}
于 2012-05-09T21:52:41.780 に答える