c++ 基类的析构函数
c++ 中,析构函数相关的几个概念
ID | Description |
---|---|
=0 | incorrect, 这种定义是错误的,=0意味着没有定义。然后子类descontructor在编译的时候会扩张,以静态调用的方式调用其每一个virtual base class 以及上一层base class 的destructor.因此,只要缺乏任何一个base class destructors的定义,就会导致编译失败 |
=default | ok 默认构造,会析构data member成员 |
{} | ok空的,跟default等价,但是定义了 |
virtual | 必须的, 否则多态析构的时候,删除不掉子类的部分,见前面的博客 |
reference
纯虚函数的定义
The virtual function
that is only declared but not defined in the base class is called the pure virtual functions.
虚析构函数
在C++中,虚析构函数是一种特殊类型的析构函数,它的作用是通过指针释放动态分配的内存,从而避免了出现内存泄漏的情况。
在介绍虚析构函数之前,我们需要先了解构造函数和析构函数的概念。构造函数是一种特殊类型的函数,它在创建对象时被自动调用,用于初始化对象的数据成员。析构函数是一种特殊类型的函数,它在对象生命周期结束时被自动调用,用于释放对象的动态分配的内存和资源。
然而,当我们使用继承和多态来设计类时,就需要使用虚析构函数了。在使用基类指针指向派生类对象并删除指针时,如果这个类没有虚析构函数,那么只会调用基类的析构函数,不会调用派生类的析构函数,从而导致内存泄漏。而如果有了虚析构函数,删除基类指针时就会调用派生类的析构函数,从而成功释放内存。
以下是一个使用虚析构函数避免内存泄漏的示例代码:
#include <iostream>
using namespace std;
class Animal {
public:
Animal() {
cout << "Animal constructor" << endl;
}
virtual ~Animal() {
cout << "Animal destructor" << endl;
}
};
class Dog : public Animal {
public:
Dog() {
cout << "Dog constructor" << endl;
}
~Dog() {
cout << "Dog destructor" << endl;
}
};
int main() {
Animal *animal = new Dog();
delete animal;
return 0;
}
在这个示例中,我们定义了一个基类 Animal 和一个派生类 Dog。其中,Animal 类定义了虚析构函数,而 Dog 类继承了 Animal 类的析构函数。在 main 函数中,我们使用基类指针指向派生类对象,然后进行 delete 操作。由于 Animal 类的析构函数是虚函数,当我们删除指针时,会自动调用 Dog 类的析构函数进行释放内存,避免了内存泄漏的发生。
总的来说,虚析构函数是一种用于在继承和多态中释放内存的特殊类型的析构函数。对于使用了继承和多态的程序来说,使用虚析构函数可以避免内存泄漏,是一种非常重要的编程技巧。如果你还没有掌握虚析构函数的使用方式,那么赶紧动手写几个程序来练习吧!