gpt4 book ai didi

C++ 继承

转载 作者:太空狗 更新时间:2023-10-29 20:06:55 26 4
gpt4 key购买 nike

我正在研究一些 C++ 的 future ,并进入了一些让我感兴趣的东西。

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
}

为什么上面没有产生错误。是不是Derived3里面没有数据可以发布。还是我遗漏了什么?
但它输出

C: Base
C: Derived
C: Derived2
D : Derived3 <--- SHOULD NOT BE POSSIBLE
D : Derived2
D : Derived
D : Base

最佳答案

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

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

试验未定义的行为是毫无意义的。您观察到的结果绝对没有任何意义,而且通常不可重复。

关于C++ 继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5507969/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com