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),因此您很少需要向下转换。