Виртуальный конструктор невозможен, но возможен виртуальный деструктор.
Давайте поэкспериментируем ....
#include <iostream>
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;
}
Приведенный выше код выдает следующее:
Base Constructor Called
Derived constructor called
Base Destructor called
Конструкция производного объекта следует правилу построения, но когда мы удаляем указатель «b» (базовый указатель), мы обнаружили, что вызывается только базовый деструктор. Но этого не должно быть. Чтобы сделать это правильно, мы должны сделать базовый деструктор виртуальным.
Теперь давайте посмотрим, что происходит в следующем:
#include <iostream>
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;
}
Выход изменился следующим образом:
Base Constructor Called
Derived Constructor called
Derived destructor called
Base destructor called
Таким образом, уничтожение базового указателя (который занимает выделение для производного объекта!) Следует правилу уничтожения, то есть сначала Derived, а затем Base.
С другой стороны, нет ничего похожего на виртуальный конструктор.