class CBase { };
class CDerived: public CBase { };

CBase     b;
CBase*    pb;
CDerived  d;
CDerived* pd;

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

我知道“衍生基础” Actor 表是错误的。但是它的内在原因是什么呢?内部的逻辑原因是什么?我猜很难在没有更多解释的情况下记住这一点。
谢谢!

最佳答案

对于派生到基本的转换,您根本不需要(而且通常也不需要)显式指定强制类型转换:

CDerived d;
CBase *pb = &d;   // perfectly fine

派生转换的基础并不是真的错误,尽管您通常希望避免使用它。其背后的原因很简单:指向基础的指针可能指向实际的基础对象或任何从其衍生的对象。如果要像这样向下转换,通常需要检查转换是否成功。在您给出的特定情况下,它不会成功,因此分配的内容(dynamic_cast的结果)将只是一个空指针。

大多数时候,您希望为基类中的类的对象指定一个完整的接口(interface),因此您很少需要向下转换。

10-07 14:48