Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对派生类的动态_转换返回nullptr_C++ - Fatal编程技术网

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*
的动态强制转换必须失败