【问题标题】:dynamic_cast to derived class returns nullptr [duplicate]派生类的dynamic_cast返回nullptr [重复]
【发布时间】:2019-01-28 05:41:09
【问题描述】:

在下面的代码中,为什么dynamic_cast 不产生Base *

#include <cassert>

class BaseI;

class SystemI {
public:
    virtual ~SystemI() {}
    virtual void remove(BaseI *) = 0;
};

class BaseI {
public:
    SystemI * system = nullptr;
    virtual ~BaseI() {
        system->remove(this);
    }
};

class Base : public BaseI { };

class System : public SystemI {
public:
    System() {
        Base base;
        base.system = this;
    }
    void remove(BaseI * basei) override {
        Base * base = dynamic_cast<Base *>(basei);
        assert(base != nullptr); // <-------------------- fails
    }
};

int main() {
    System sys;
}

我的意图是创建一种机制,使派生自 BaseI 的组件在删除时自动从系统中删除。

【问题讨论】:

    标签: c++


    【解决方案1】:

    在 C++ 中,派生类对象的“派生性”在基类析构函数开始运行之前被销毁。因此,当Base 对象超出范围时,它的(空)析构函数Base::~Base 首先运行;一旦完成,就不再有Base 对象,但仍然有一个BaseI 对象,必须随后将其销毁。因此,当BaseI::~BaseI 运行并调用remove 时,对Base* 的动态转换必须失败。

    【讨论】:

      猜你喜欢
      • 2013-05-11
      • 1970-01-01
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 2020-08-21
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      相关资源
      最近更新 更多