Наследование от std::vector

Подробно изучая механизм наследования в C++ наткнулся на такую фразу деструктор полиморфного базового класса должен объявляться виртуальным. Легально ли наследоваться от std::vector, если его деструктор объявлен без virtual?


Ответы (2 шт):

Автор решения: user7860670

Легально. Виртуальный деструктор в базовом классе при наследовании нужен только когда владение объектом будет осуществляться через указатель на базовый класс. Кроме того, std::vector не является полиморфным классом.

→ Ссылка
Автор решения: goldstar_labs
#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()

Т.о. само по себе наследование от класса с невиртуальным деструктором вполне легально, но при работе с динамическими объектами оно порождает ошибку с пропуском вызова полиморфного деструктора нужного класса

→ Ссылка