我有一个基类和派生类的层次结构。基类有一个虚函数,被派生类覆盖。
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。
我知道如果我使用虚拟析构函数,则可以解决裸指针的警告。 但问题仍然存在-为什么没有虚拟析构函数会导致裸指针的问题,而unique_ptr则不会。
clang
确实会抱怨:https://godbolt.org/z/qEp6Ts - Max Langhof