-1
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 类应该是虚拟的?

4

3 回答 3

7

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

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

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

需要做的机器dynamic_cast是非零的。因此,根据“按使用付费”的原则,只有那些有用的课程才会付费。IE:那些是虚拟的类。

于 2012-08-06T03:36:21.247 回答
1

输出将大致如下:

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

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

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

于 2012-08-06T03:22:49.300 回答
0

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

于 2013-12-20T11:29:23.527 回答