Наследование от std::vector
Подробно изучая механизм наследования в C++ наткнулся на такую фразу деструктор полиморфного базового класса должен объявляться виртуальным. Легально ли наследоваться от std::vector, если его деструктор объявлен без virtual?
Ответы (2 шт):
Легально. Виртуальный деструктор в базовом классе при наследовании нужен только когда владение объектом будет осуществляться через указатель на базовый класс. Кроме того, std::vector не является полиморфным классом.
#include <cstdlib>
#include <iostream>
using std::cout;
using std::endl;
class A {
public:
A() { cout << "A()" << endl; }
~A() { cout << "~A()" << endl; }
};
class B : public A {
public:
B() { cout << "B()" << endl; }
~B() { cout << "~B()" << endl; }
};
int main()
{
B b;
return 0;
}
Вывод
A()
B()
~B()
~A()
Теперь с указателями
int main()
{
A * pA = new B;
delete pA;
return 0;
}
Вывод
A()
B()
~A()
Т.о. само по себе наследование от класса с невиртуальным деструктором вполне легально, но при работе с динамическими объектами оно порождает ошибку с пропуском вызова полиморфного деструктора нужного класса