c++ - 持有派生类引用的基类的 std::unique_ptr 在 gcc 编译器中不显示警告,

我有一个基类和派生类的层次结构。基类有一个被派生类覆盖的虚函数。

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 的问题。

最佳答案

首先,当基类没有虚拟析构函数时,通过基指针删除派生对象是未定义的行为。编译器不需要诊断未定义的行为……

话虽如此,使用 std::unique_ptr 时没有出现此警告的原因很可能是由于 GCC does not report warnings that would appear in system headers .

关于c++ - 持有派生类引用的基类的 std::unique_ptr 在 gcc 编译器中不显示警告,而裸指针显示它。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55848866/

相关文章:

c++ - 库已链接,但引用未定义

c++ - 什么是 C++ 内联类?

c++ - 动态和静态范围程序差异

c++ - C++ 标准是否对 float 的表示做了任何规定?

c++ - 析构函数可以是最终的吗?

c++ - 如何使用 C++ 模板减少编译时间

c++ - 从基类构造函数调用纯虚函数

c++ - GCC 4.x/C++11 中的 std::string 引用计数了吗?

c++ - 如何在 Windows 上找到 Qt5 CMake 模块

c++ - 虚函数默认参数行为