我是新手,我知道这是一个非常基本的概念,也可能是重复的.一旦调用了构造函数,就必须调用其相应的析构函数,这不是真的吗?[代码在 Dev C++ 上运行]
I am a newbie and I know this is a very basic concept and might be a duplicate too. Is it not true that once a constructor is called its corresponding destructor has to be called? [code run on Dev C++]
class Base
{
public:
Base() { cout<<"Base Constructor
";}
int b;
~Base() {cout << "Base Destructor
"; }
};
class Derived:public Base
{
public:
Derived() { cout<<"Derived Constructor
";}
int a;
~Derived() { cout<< "Derived Destructor
"; }
};
int main () {
Base* b = new Derived;
//Derived *b = new Derived;
delete b;
getch();
return 0;
}
给出输出
Base Constructor
Derived Constructor
Base Destructor
您的代码有未定义的行为.基类的析构函数必须是 virtual
以便以下具有定义的行为.
Your code has undefined behavior. The base class's destructor must be virtual
for the following to have defined behavior.
Base* b = new Derived;
delete b;
来自 C++ 标准:
5.3.5 删除
3 在第一种选择中(删除对象),如果静态类型的操作数与其动态类型不同,静态类型应为操作数动态类型的基类,静态类型应具有虚析构函数或行为未定义.
3 In the first alternative (delete object), if the static type of the operand is different from its dynamic type, the static type shall be a base class of the operand’s dynamic type and the static type shall have a virtual destructor or the behavior is undefined.
所以在你的情况下,静态类型是 Base
,动态类型是 Derived
.所以 Base
的析构函数应该是:
So in your case, the static type is Base
, and the dynamic type is Derived
. So the Base
's destructor should be:
virtual ~Base() {cout << "Base Destructor
"; }
这篇关于在 C++ 继承中,当指向基类的指针对象指向派生类时,不调用派生类析构函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!