C++ dynamic_cast

C++ dynamic_cast

本文关键字:cast dynamic C++      更新时间:2023-10-16
class A
{
};
class B:public A
{
};
int main()
{
    A a;
    B b;
    A *ap = &b;
    B *bp = dynamic_cast<B*>(ap);
    if(bp!= NULL)
       cout<<"Pass"<<endl;
    else
       cout<<"Fail"<<endl;
    return 0;
}

如果你想做一个动态投射,为什么A类应该是虚拟的?

dynamic_cast的工作方式与static_cast不同。static_cast的结果始终是一个指针。但是,如果强制转换不正确(对于给定指针最初不是的类型(,则强制转换的结果是未定义的;指针不一定有效。因此,使用 static_cast 强制转换为派生类时存在一定程度的不确定性;没有任何机制可以阻止您投向错误的东西。

如果强制转换正确,dynamic_cast将返回有效指针,如果转换不正确,则返回 null 指针。因此,在所有情况下,结果都是明确的。为此,dynamic_cast必须是动态的。这意味着它必须对指针执行运行时检查,以查看要强制转换为的类型是否是合法的强制转换操作。

C++禁止对

非虚拟类型进行强制转换,因为"按使用量付费"原则:没有虚函数的类型通常不是由其基类传递的类型。没有虚拟的继承主要是关于使用现有的实现,而不是关于专门的函数。即使是像虚拟析构函数这样简单的东西也足够了。

dynamic_cast所需的机器不是零的。因此,在"按使用量付费"的原则下,只有那些有用的课程才能为他们付费。IE:那些虚拟的类。

输出将是这样的:

错误 xxxx:dynamic_cast参数无效。类是非多态类型。

类必须是多态的,因为这是dynamic_cast的规范。在内部,dynamic_cast检查虚拟表指针,但这是一个实现细节。

在这种情况下,您可以使用static_cast

virtual是多态性的关键。虚函数意味着它被派生类"覆盖",否则类之间没有多态性,只有继承。如果类不是多态的,则不能使用该dynamic_cast