c++ - dynamic_cast 到派生类返回 nullptr
问题描述
在下面的代码中,为什么不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++ 中,派生类对象的“派生性”在基类析构函数开始运行之前被销毁。因此,当Base
对象超出范围时,它的(空)析构函数Base::~Base
首先运行;一旦完成,就没有Base
对象了,但仍然有一个BaseI
对象,必须随后销毁。BaseI::~BaseI
因此,当运行并调用remove
时,动态转换Base*
必须失败。
推荐阅读
- python - 处理自适应算术编码中的下溢
- game-physics - 每帧的最小移动量
- python-3.x - IndexError:排列期间的列表索引超出范围错误
- three.js - ThreeJS FPS 下降
- javascript - 我如何获取另一个页面上的 DOM 的内容,我通过单击使用 JSDOM 的按钮(网络抓取)来访问该页面
- python - 将列转换为 4 维数据以绘制 3d 曲面图
- java - 我在理解 Head First 的 JavaBean 解释时遇到的问题
- c# - 无法将结构数组从 c 编组到 c#
- c# - 如何将 GUITree 节点移动/拖动到 SAP 中的另一个同级节点
- java - 自定义 Edittext 和 Button