gpt4 book ai didi

c++ - 为什么我们没有义务实现纯虚析构函数?

转载 作者:太空宇宙 更新时间:2023-11-03 10:40:19 25 4
gpt4 key购买 nike

使类抽象化是通过使其成员函数之一成为纯虚函数。

将类抽象为类的子类必须实现基本的纯虚函数。

我们甚至可以使基类析构函数成为纯析构函数,这足以成为抽象类。

问题:

  • 为什么我们没有义务在派生类中实现纯虚基类的析构函数?

  • 是不是说C++默认给我们添加了构造函数、拷贝构造函数、赋值函数和析构函数这四个成员函数就不需要在派生类中实现了?

例如:

#include <iostream>
using namespace std;

class Base
{
public:
Base(){cout << "Base Ctor" << endl;}
virtual ~Base() = 0 {cout << "Virtual base dtor" << endl; }
};

class Derived : public Base
{
public:
Derived(){cout << "Derived Ctor" << endl;}
// virtual ~Derived() {cout << "Virtual Derived dtor" << endl; }
};

int main()
{

Base* theBase = new Derived;
delete theBase;

cout << endl;


cout << endl << endl;
return 0;
}
  • 我知道如果内存是动态分配的,我应该添加子析构函数来释放内存。

最佳答案

why we are not obliged to implement the pure virtual base's destructor in our derived class?

因为析构函数不会被覆盖。

为了帮助记住这一点,请考虑名称:~Base~Derived 是不一样的。构造函数和析构函数不是通过覆盖工作,而是在链中调用:最底层的析构函数运行,然后调用其父析构函数,父析构函数运行,然后调用其父析构函数等。

这就是为什么如果您想删除其中一个派生类的实例,您必须为析构函数提供主体,即使它被标记为纯虚拟:它需要一个主体来调用在析构函数链中到达它时。

那么,开始时虚拟析构函数有什么用呢?这样做是为了让编译器知道在遇到某个类的破坏时调用最底层的析构函数。所以析构确实使用了虚表,只是在派生析构函数完成后运行父类析构函数,所以它不是标准的覆盖。

does it mean as long as C++ adds to us four member functions by default: constructor, copy constructor, assignment and Destructor we don't need to implement it in our derived class?

不太理解这个问题,但无论如何,默认添加的方法都不是纯虚拟的,可以在继承链中的每个类中创建。

关于c++ - 为什么我们没有义务实现纯虚析构函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40588712/

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