C++ 中的虚析构器

原文:https://www.studytonight.com/cpp/virtual-destructors.php

基类中的析构器可以是虚函数。每当完成向上转换时,基类的析构器必须是虚拟的,以便在程序退出时正确地销毁对象。

注意: 构造器永远不是虚的,只有析构器可以是虚的。


C++ 中不带虚析构器的向上转换

让我们首先看看当我们没有虚拟基类析构器时会发生什么。

class Base
{
    public:
    ~Base() 
    {
        cout << "Base Destructor\n"; 
    }
};

class Derived:public Base
{
    public:
    ~Derived() 
    { 
        cout<< "Derived Destructor\n"; 
    }
}; 

int main()
{
    Base* b = new Derived;     // Upcasting
    delete b;
}

摧毁基地

在上面的例子中,delete b将只调用基类析构器,这是不可取的,因为派生类的对象仍然没有被构造,因为它的析构器从未被调用过。这会导致内存泄漏。


C++ 中虚析构器的向上转换

现在让我们看看。当我们在基类中有虚析构器时会发生什么。

class Base
{
    public:
    virtual ~Base() 
    {
        cout << "Base Destructor\n"; 
    }
};

class Derived:public Base
{
    public:
    ~Derived() 
    { 
        cout<< "Derived Destructor"; 
    }
}; 

int main()
{
    Base* b = new Derived;     // Upcasting
    delete b;
}

派生析构器基析构器

当基类中有虚析构器时,首先调用派生类的析构器,然后调用基类的析构器,这是期望的行为。


C++ 中的纯虚析构器

  • 纯虚析构器在 C++ 中是合法的。此外,必须定义纯虚析构器,这与纯虚拟行为相反。
  • 虚析构器和纯虚析构器的唯一区别是,纯虚析构器将使其基类抽象,因此您不能创建该类的对象。
  • 不需要在派生类中实现纯虚析构器。
class Base
{
    public:
    virtual ~Base() = 0;     // Pure Virtual Destructor
};

// Definition of Pure Virtual Destructor
Base::~Base() 
{ 
    cout << "Base Destructor\n"; 
} 

class Derived:public Base
{
    public:
    ~Derived() 
    { 
        cout<< "Derived Destructor"; 
    }
};