C ++ dynamic_cast

时间:2012-08-06 03:20:34

标签: 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;
}

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

3 个答案:

答案 0 :(得分:6)

dynamic_caststatic_cast的工作方式不同。 static_cast的结果始终是指针。但是,如果强制转换不正确(对于给定指针最初不是的类型),那么强制转换的结果是未定义的;指针不一定有效。因此,在使用static_cast转换为派生类时存在一定程度的不确定性;没有任何机制可以防止你误入歧途。

如果强制转换正确,

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

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

dynamic_cast所需的机制不为零。因此,在“为你使用的东西付费”原则下,只有那些有用的课程才能为它们付费。 IE:那些虚拟的类。

答案 1 :(得分:1)

输出结果如下:

  

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

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

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

答案 2 :(得分:0)

virtual是多态的关键。虚函数意味着它可以被派生类“覆盖”,否则类之间不存在多态,只有继承。如果类不是多态的,则不能使用dynamic_cast