Когда использовать виртуальные деструкторы?
Виртуальный конструктор невозможен, но 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
Когда использовать виртуальные деструкторы?
Мы используем файлы cookies для улучшения работы сайта. Оставаясь на нашем сайте, вы соглашаетесь с условиями использования файлов cookies. Чтобы ознакомиться с нашими Положениями о конфиденциальности и об использовании файлов cookie, нажмите здесь.