C++ 对派生类的动态_转换返回nullptr
在下面的代码中,为什么C++ 对派生类的动态_转换返回nullptr,c++,C++,在下面的代码中,为什么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() { s
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类;
系统I类{
公众:
虚拟~SystemI(){}
虚拟无效删除(BaseI*)=0;
};
BaseI类{
公众:
SystemI*system=nullptr;
虚拟~BaseI(){
系统->删除(此);
}
};
类基:publicbasei{};
类别系统:公共系统I{
公众:
系统(){
基地;
base.system=this;
}
无效删除(BaseI*BaseI)覆盖{
基础*Base=动态_型铸造(basei);
Actudit(Base.NullpTR);// C++中,派生类对象的“派生性”在基类析构函数开始运行之前被破坏。因此,当 Base< /Cl>对象超出范围时,其(空)析构函数<代码>基::~(基)<代码>运行第一;一旦完成,就没有“代码> BASE< /Cord>对象,但仍然有一个<代码> Base< /Cord>对象,它必须随后被销毁。当<代码> Base::BaseE/Cuth>运行,并调用<代码>删除< /代码>时,动态CAST到基** /代码>必须失败。C++中的
< P>派生类对象的“派生性”在基类析构函数开始运行之前被销毁。因此,当base
对象超出范围时,其(空)析构函数Base::~Base
首先运行;完成后,不再有Base
对象,但仍有一个BaseI
对象,必须随后销毁。因此,当BaseI::~BaseI
运行并调用remove
时,对Base*
的动态强制转换必须失败