c ++ dynamic_cast

use*_*266 2 c++ dynamic-cast

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
Run Code Online (Sandbox Code Playgroud)

我知道"衍生的基础"演员是错误的.但它的内在原因是什么?内在的逻辑原因是什么?我想,如果没有更多的解释,很难记住这一点.谢谢!

Jam*_*lis 6

首先,CBase必须是多态的才能在dynamic_cast这里使用(也就是说,它必须至少有一个virtual成员函数).否则,你不能使用dynamic_cast.

这就是说,对投&bCDerived*不是错: pd会是一个空指针.

dynamic_cast具有有用的属性,当转换失败时(即,如果指针指向的对象不是目标类型),它会产生一个空指针.这允许您测试对象的实际类型.例如:

CBase b;
CDerived d;

CBase* pb = &b;
CBase* pd = &d;

CDerived* xb = dynamic_cast<CDerived*>(pb); // xb is null!
CDerived* xd = dynamic_cast<CDerived*>(pd); // xd points to d!
Run Code Online (Sandbox Code Playgroud)

如果您使用了代码,那么您的代码将是不正确的static_cast,因为它在不执行任何运行时类型检查的情况下进行转换,这意味着无法测试转换是否成功.如果您需要抛弃类层次结构并且您不确定对象是否是您要尝试强制转换的派生类型,则必须使用dynamic_cast.