Когда использовать виртуальные деструкторы?

Виртуальный конструктор невозможен, но cpp возможен виртуальный деструктор. Давайте shared-pointers поэкспериментируем .......

#include 

using namespace std;

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

class Derived1: public Base
{
public:
    Derived1(){
        cout << "Derived constructor called\n";
    }
    ~Derived1(){
        cout << "Derived destructor called\n";
    }
};

int main()
{
    Base *b = new Derived1();
    delete b;
}

Приведенный cpp выше код выводит следующее:

Base Constructor Called
Derived constructor called
Base Destructor called

Создание c++ производного объекта соответствует c++ правилу построения, но когда c++ мы удаляем указатель «b» (базовый boostshared-ptr указатель), мы обнаружили, что cpp вызывается только базовый cxx деструктор. Но этого не должно cxx быть. Чтобы сделать что-то cpp подходящее, мы должны сделать polymorphism базовый деструктор виртуальным. Теперь virtual-destructor посмотрим, что происходит cxx в следующем:

#include 

using namespace std;

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

class Derived1: public Base
{
public:
    Derived1(){
        cout << "Derived constructor called\n";
    }
    ~Derived1(){
        cout << "Derived destructor called\n";
    }
};

int main()
{
    Base *b = new Derived1();
    delete b;
}

Вывод изменился cpp следующим образом:

Base Constructor Called
Derived Constructor called
Derived destructor called
Base destructor called

Таким образом, уничтожение cxx базового указателя (который polymorphic занимает выделение для производного shared-ptr объекта!) следует правилу shared-pointers уничтожения, то есть сначала polymorphism Derived, затем Base. С другой polymorphic стороны, нет ничего лучше shared-ptr виртуального конструктора.

c++

polymorphism

shared-ptr

virtual-destructor

2022-11-18T20:55:10+00:00
Вопросы с похожей тематикой, как у вопроса:

Когда использовать виртуальные деструкторы?