虚析构函数
如果一个类为父类,且这个类含有其他虚函数,那么该父类需要设置虚析构函数。
需要定义虚析构函数的场景:动态多态
class Base {
public:
virtual print() { std::cout << "Base" << std::endl; }
};
class Widegt : public Base {
public:
virtual print() { std::cout << "Base" << std::endl; }
};
int main() {
Base* base = new Widget();
delete base;
return 0;
}
在base指针被销毁时,编译器会自动调用base的析构函数。因为编译器根据base的数据类型Base调用对应的析构函数,就会调用~Base()。但是我们实际创建的是Widget类型,空间大小是sizeof(Widget)。如果不调用Widget的析构函数,可能造成内存泄漏。如果我们设置Base的析构函数为虚析构函数,编译器就会查看子类的虚函数表,调用子类的析构函数,而子类的析构函数又会隐藏调用父类的析构函数,这样就可以完美释放所有空间。
纯虚析构函数
class Base {
public:
virtual print() { std::cout << "Base" << std::endl; }
virtual ~Base() = 0;
};
Base::~Base() {}
当类中没有其他纯虚函数时,又不想让该类实例化,我们可以设置纯虚析构函数。