Всем привет!
В интернетах пишут, что для того, чтобы не было утечки памяти при наследовании, необходимо деструкторы всех предков делать виртуальными. С другой стороны, архитектура может быть достаточно гибкой и от части классов, которые ранее казались конечными (самые последние производные классы), придется еще раз наследоваться, расширяя функционал. Мало ли что в голову заказчикам и маркетологам взбредет. Каковы будут последствия того, что все деструкторы всех классов всегда делать виртуальными (за исключением случаев, когда понадобится чистый виртуальный деструктор)?
Такой код у меня корректно отработал
#include <iostream>
using namespace std;
class A
{
public:
A(int a) : a(a){cout<<a<<endl;}
virtual ~A() =0;
private:
int a;
};
A::~A()
{
cout<<"~A"<<endl;
}
class B : public A
{
public:
B(int b) : A(b-10), b(b){cout<<b<<endl;}
virtual ~B(){cout<<"~B"<<endl;}
private:
int b;
};
class C : public B
{
public:
C(int c) : B(c-10),c(c){cout<<c<<endl;}
virtual ~C(){cout<<"~C"<<endl;}
private:
int c;
};
int main()
{
A* f=new C(30);
delete f;
C g(67);
return 0;
}