【问题标题】:C++ dynamic_castC++ 动态转换
【发布时间】:2012-08-06 03:20:33
【问题描述】:
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 类应该是虚拟的?

【问题讨论】:

    标签: c++ virtual dynamic-cast


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      输出将大致如下:

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

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-09-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-16
          • 2020-10-06
          相关资源
          最近更新 更多