虚析构函数

虚析构函数

如果一个类为父类,且这个类含有其他虚函数,那么该父类需要设置虚析构函数。

需要定义虚析构函数的场景:动态多态

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() {}

当类中没有其他纯虚函数时,又不想让该类实例化,我们可以设置纯虚析构函数。

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top