我在 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/