#include<iostream>
using namespace std;
class base {
protected:
int a;
};
class derived : public base {
};
int main() {
base * pointer_of_base = new derived;
delete pointer_of_base; // this will delete the base calss not the derived
}
Конструкторы вызываются один раз, когда мы создаем объект класса, поэтому, когда мы наследуем, конструкторы базового класса вызывают только один раз, поэтому нет необходимости быть виртуальным.
Но когда мы обращаемся к производному классу из указателя базового класса, если мы хотим удалить объект производного класса, мы удаляем его по указателю базового класса, но delete (pointer_of_base) вызовет деструктор базового класса но фактический девиз - удалить производный класс. поэтому нам нужно, чтобы деструктор был виртуальным по своей природе.