c ++继承

use*_*740 3 c++ inheritance

我正在玩一些c ++期货,并且进入了一些吸引我的东西.

class Base
{
       public:
          Base(){ cout<<"C: Base"<<endl;}
          ~Base(){ cout<<"D : Base"<<endl;}
};
class Derived: public Base
{
       public:
           Derived(){ cout<<"C: Derived"<<endl;}        
           ~Derived(){ cout<<"D : Derived"<<endl;}
};

class Derived2: public Derived
{
       public:
           Derived2(){ cout<<"C: Derived2"<<endl;}
           ~Derived2(){ cout<<"D : Derived2"<<endl;}
};

class Derived3: public Derived2
{
       public:
           Derived3(){ cout<<"C: Derived3"<<endl;}
           ~Derived3(){ cout<<"D : Derived3"<<endl;}
};

void main()
{
        Derived *Var = new Derived2();
        delete (Derived3*)Var;  //<---- this should cause some type of run-time error
}
Run Code Online (Sandbox Code Playgroud)

为什么以上不会产生错误.是因为Derived3中没有数据要发布.或者我错过了什么?
但相反,它输出

C: Base
C: Derived
C: Derived2
D : Derived3       <--- SHOULD NOT BE POSSIBLE
D : Derived2
D : Derived
D : Base
Run Code Online (Sandbox Code Playgroud)

AnT*_*AnT 6

C++语言没有任何广泛的"运行时错误"系统.某些语言功能可能会抛出异常或调用terminate(),这确实是"运行时错误",但无效delete则不是这些功能之一.

做一些像你一样无效的事情会导致C++中出现未定义的行为.未定义的行为意味着任何事情都可能发生,一切皆有可能.您的程序甚至可能表现得像是以某种方式"工作".这就是你观察到的.

尝试未定义的行为是一项毫无意义的练习.你观察到的结果绝对没有意义,通常是不可重复的.