首页 > 解决方案 > 将基类转换为派生类时 dynamic_cast 失败

问题描述

我有两个类,基类和派生类。基类有一个虚方法。

这是我的测试示例:

class Base
{
public:
    virtual void Hello() { cout << "-> Hello Base" << endl; }
};

class Derived: public Base
{
public:
    void Hello() { cout << "-> Hello Derived" << endl; }
};

int main()
{
    Base *mBase = new Base;
    // something to do 
    ....

    Derived *mDerived = dynamic_cast<Derived*>(mBase);
    mDerived->Hello();

    return 0;
}

我正在寻找使用 to 转换后Hello()派生的类的方法。mBasemDerived

但问题是,当我尝试使用dynamic_cast它时,应用程序会崩溃,否则如果我使用该类reinterpret_castHello()方法,Base则会被调用。

案例结果dynamic_cast

Segmentation fault (core dumped)

案例结果dynamic_cast

-> Hello Base

标签: c++polymorphismdynamic-castreinterpret-cast

解决方案


将基类转换为派生类时 dynamic_cast 失败

这是应该发生的事情。当您将指针动态转换为指向其动态类型不是转换类型的对象时,您会得到一个空指针作为结果。

在您的示例中,您间接通过空指针并尝试调用导致未定义行为的成员函数。

使用动态转换时,您必须始终检查是否为 null。

如果我使用 reinterpret_cast ...

然后行为仍然是未定义的,因为您将通过指向不存在的对象的指针进行间接。除非创建派生类的实例,否则不能调用其非静态成员函数。

您可以将基本实例转换为派生实例,例如:

Base b;
Derived d = b;

发生的情况是派生实例的基本子对象是从 复制初始化的b


推荐阅读