c++ - GNU 编译器警告 "class has virtual functions but non-virtual destructor"

标签 c++ gcc

我在 C++ 中定义了一个接口(interface),即一个只包含纯虚函数的类。

我想明确禁止接口(interface)的用户通过指向接口(interface)的指针删除对象,所以我为接口(interface)声明了一个 protected 非虚拟析构函数,类似于:

class ITest{
public:
    virtual void doSomething() = 0;

protected:
    ~ITest(){}
};

void someFunction(ITest * test){
    test->doSomething(); // ok
    // deleting object is not allowed
    // delete test; 
}

GNU 编译器给我一个警告说:

class 'ITest' has virtual functions but non-virtual destructor

一旦析构函数被保护了,它是虚拟的还是非虚拟的有什么区别?

您认为可以安全地忽略或消除此警告吗?

最佳答案

这或多或少是编译器中的一个错误。请注意,在最新版本的编译器中,不会抛出此警告(至少在 4.3 中不会)。在您的情况下,让析构函数受到保护且非虚拟是完全合法的。

here Herb Sutter 就该主题发表了一篇出色的文章。来自文章:

准则 #4:基类析构函数应该是公共(public)的和虚拟的,或者是 protected 和非虚拟的。

关于c++ - GNU 编译器警告 "class has virtual functions but non-virtual destructor",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/127426/

相关文章:

c - 在 MPLAB X ide 上编译 c 文件时出错

c++ - 在生产中使用 GCC 的 C++0x 模式?

c++ - 在容器中使用 reference_wrapper 而不是原始指针的好处?

C++在 map 中插入unique_ptr

c++ - 在C++中,方法和函数有什么区别

c++ - 带有 std::execution::par_unseq 的 std::for_each 不适用于 GCC 但适用于 MSVC

c++ - fclose() 的 free()/delete/delete[]/realloc() 无效?

C++ Pin共享库 undefined symbol

c - 局部同义变量到非精确类型

c - Scanf 在 C 中跳过每隔一个 while 循环