У меня есть иерархия базового класса и производного класса. Базовый класс имеет одну виртуальную функцию, которая переопределяется производным классом.
class Base
{
public:
~Base();
virtual void other_functionality() = 0;
};
class Derived : public Base
{
public:
~Derived ();
void other_functionality() {//some code};
};
Теперь, если я делаю так:
int main()
{
Base * P = new Derived ();
delete p;
return 0;
}
Это дает ошибку:
удаление объекта типа полиморфного класса, который имеет не виртуальный деструктор.
Но с unique_ptr это проходит без предупреждения.
int main()
{
std::unique_ptr<Base> p;
p.reset(new Derived ());
return 0;
}
Я знаю, использую ли я виртуальный деструктор. Предупреждение с голым указателем будет решено. Но остается вопрос - почему отсутствие виртуального деструктора показывает проблему с голым указателем, а не с unique_ptr.