C++学习笔记 35 虚析构函数
一、虚析构函数的使用场景
- 父类引用指向子类对象,子类对象的析构函数不能被调用,只有父类的可以被调用
二、virtual函数
- 普通方法前标记为virtual, 那么它就可以被覆写,那么这就意味着要做虚函数表这样的设置。
- 析构函数不一样,virtual 析构函数, 不是覆写析构函数,而是加上一个析构函数。
- 如果把基类析构函数标记为virtual,则实际上会调用2个析构函数。先调用派生类的,再调用基类的。
三、代码
#include<iostream>
class Base {
public:
Base() { std::cout << "Base() \n"; }
~Base() { std::cout << "~Base() \n"; }
//virtual ~Base() { std::cout << "~virtual Base() \n"; }
};
class Son : public Base {
private:
int* arr;
public:
Son() {
arr = new int[10];
std::cout << "Son() \n";
}
~Son() {
delete[] arr;
std::cout << "~Son() \n";
}
};
void testVirtualDestructor() {
Base* base = new Base();
delete base;
std::cout << "------------------------\n";
Son* son = new Son();
delete son;
std::cout << "------------------------\n";
Base* son2 = new Son();
delete son2;
std::cout << "------------------------\n";
}
int main() {
testVirtualDestructor();
}
- 基类虚构函数不带virtual
Base()
~Base()
------------------------
Base()
Son()
~Son()
~Base()
------------------------
Base()
Son()
~Base()
------------------------
- 基类虚构函数带virtual
Base()
~virtual Base()
------------------------
Base()
Son()
~Son()
~virtual Base()
------------------------
Base()
Son()
~Son()
~virtual Base()
------------------------
------------------------
四、总结
当写一个要拓展的类或子类时,这一点非常重要,只要你允许一个类拥有子类,你需要百分之一百的声明其析构函数为虚函数,否则没人能安全的拓展这个类,包括你自己也不能。

浙公网安备 33010602011771号