C++ dynamic_cast

ran*_*111 -1 c++ virtual dynamic-cast

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

如果你想进行动态演员,为什么A类应该是虚拟的呢?

Nic*_*las 6

dynamic_cast与...有所不同static_cast.a的结果static_cast总是一个指针.但是,如果强制转换不正确(对于给定指针最初不是的类型),那么强制转换的结果是未定义的; 指针不一定有效.因此,在使用派生类进行转换时存在一定程度的不确定性static_cast; 没有机制可以阻止你转向错误的东西.

dynamic_cast如果强制转换正确则返回有效指针,如果不正确则返回空指针.因此,结果在所有情况下都是明确定义的.为了做到这一点,dynamic_cast必须是动态的.这意味着它必须对指针进行运行时检查,以查看正在转换为的类型是否为合法的转换操作.

C++禁止为非虚拟类型转换,因为"为你使用的东西付费"原则:没有虚函数的类型通常不是你的基类传递的类型.没有虚拟的继承主要是关于使用现有实现,而不是关于专门化功能.即使像虚拟析构函数这样简单的东西就足够了.

需要做的机器dynamic_cast是非零的.因此,在"为你使用的东西付费"的原则下,只有那些有用的课程才能为它们付出代价.IE:那些虚拟的类.