Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.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++ 如何仅为派生类调用析构函数?_C++_C++11_Inheritance_Polymorphism - Fatal编程技术网

C++ 如何仅为派生类调用析构函数?

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

我有两个基类和派生类。当我在main和write中只生成一个派生对象并返回0时,我看到基类的析构函数和派生类的析构函数都被调用

因此我犯了一个错误。基类析构函数用于删除已被派生类析构函数删除的内存

所以,我不想调用基类的析构函数。我只想调用派生类析构函数,因为我只生成了派生类对象

这是我的代码和错误

#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;