C++ 如何仅为派生类调用析构函数?
我有两个基类和派生类。当我在main和write中只生成一个派生对象并返回0时,我看到基类的析构函数和派生类的析构函数都被调用 因此我犯了一个错误。基类析构函数用于删除已被派生类析构函数删除的内存 所以,我不想调用基类的析构函数。我只想调用派生类析构函数,因为我只生成了派生类对象 这是我的代码和错误C++ 如何仅为派生类调用析构函数?,c++,c++11,inheritance,polymorphism,C++,C++11,Inheritance,Polymorphism,我有两个基类和派生类。当我在main和write中只生成一个派生对象并返回0时,我看到基类的析构函数和派生类的析构函数都被调用 因此我犯了一个错误。基类析构函数用于删除已被派生类析构函数删除的内存 所以,我不想调用基类的析构函数。我只想调用派生类析构函数,因为我只生成了派生类对象 这是我的代码和错误 #include <new> #include <iostream> using namespace std; class Base { public: Base
#include <new>
#include <iostream>
using namespace std;
class Base {
public:
Base(){
size=4;
arr= new int[size];
for(int i=0;i<size;i++){
arr[i]=0;
}
}
~Base(){
cout<<"Base class destructor called"<<endl;
delete[] arr;
}
protected:
int *arr;
int size;
};
class Derived : public Base {
public:
Derived(){
size=5;
arr= new int[size];
for(int i=0;i<size;i++){
arr[i]=0;
}
}
~Derived(){
cout<<"Derived class destructor called"<<endl;
delete[] arr;
}
};
int main(){
Derived derivedObject;
return 0;
}
当我在main和write中只生成一个派生对象并返回0时,我看到,base和Derived的解构器都调用了
是,派生对象包含类型为base的基类子对象
基类子对象负责自己的初始化和销毁。因此,您应该将基类对象状态的清理委托给基类析构函数
类似地,您应该将基类对象的构造委托给基类构造函数:这已经隐式发生,因此派生类构造函数会泄漏内存。classbase{
class Base {
protected:
Base(std::size_t n) {
size=n;
arr= new int[size];
for(int i=0;i<size;i++){
arr[i]=0;
}
}
public:
Base():Base(4){}
~Base(){
std::cout<<"Base class destructor called\n";
delete[] arr;
}
protected:
int *arr;
int size;
};
class Derived : public Base {
public:
Derived():Base(5){}
~Derived(){
std::cout<<"Derived class destructor called\n";
}
};
受保护的:
基础(标准尺寸){
尺寸=n;
arr=新整数[大小];
对于(int i=0;i当你赋予一个对象生命时,该对象是由所谓的构造器链构建的;这意味着如果你想赋予派生类型的对象生命,首先必须构造一个Base类型的对象。
每个构造函数都必须初始化它所属类中的成员,因此Base将初始化Base的成员,而派生的构造函数将初始化派生的成员。
同样,当您需要删除派生对象时,类似的链也会开始,但方向相反,即从派生类到基类。
必须逐块拆除对象。
:派生描述必须只删除派生类中引入的成员,而不删除其他成员。相反,请删除基类的成员是基类析构函数的独占责任。
因此,删除派生的析构函数中删除基类引入的数组的行
delete[] arr;
只保留在基类中。不可以。派生类不应该干扰基类的内部。还应该使用std::unique_ptr
并避免编写析构函数,因为派生类有基类的实例。让基类析构函数销毁基类的内容。好的,我能为它做些什么他的错误?用谷歌搜索这个词。真正的问题是:当Base
负责分配数组时,为什么要在Derived
中分配和删除数组arr
。我不明白。所以你能在这个例子中编写代码吗?你没有继承构造函数-基类子对象只是像其他任何子对象一样被创建和销毁。如果你有一个类型为base
的数据成员,它也负责初始化和销毁自身。这样想:在更不用说它封装了一些状态和行为。如果你必须在每个派生类中重新编写它的创建和销毁代码,为什么首先要写Base?但是,我们的老师说,“构造函数和解构器不能被继承”. @Yakk@tarkan我看不懂你老师的心思,而一个非程序员传递他们所记得的老师所说的话的电话游戏,在他们理解的情况下,不会传达任何有用的信息。我不知道老师所说的“被继承”是什么意思在你的引用中,我也不相信老师是这么说的。我所能做的就是用正确的方式解决你的问题。
delete[] arr;