【发布时间】:2012-09-21 18:06:38
【问题描述】:
可能重复:
GNU compiler warning “class has virtual functions but non-virtual destructor”
我正在为两个类编写一个接口,并在标题中收到警告。 代码如下:
class GenericSymbolGenerator {
protected: // <== ok
~GenericSymbolGenerator(void) {}
public:
virtual GenericSymbolTableCollection* generateSymbolTableCollection(GenericSymbolTableCollection *gst) = 0;
GenericSymbolGenerator(void) {}
// ~GenericSymbolGenerator(void) {} // <== warning if used
};
class PascalPredefinedSymbolGenerator : public GenericSymbolGenerator {
protected:
~PascalPredefinedSymbolGenerator(void) {} // <== ok
public:
GenericSymbolTableCollection* generateSymbolTableCollection(GenericSymbolTableCollection *pst); // initializes *pst
PascalPredefinedSymbolGenerator(void) {}
// ~PascalPredefinedSymbolGenerator(void) {} <== warning if used
};
class PascalSymbolGenerator : public GenericSymbolGenerator {
protected:
~PascalSymbolGenerator(void) {} // <== ok
public:
GenericSymbolTableCollection* generateSymbolTableCollection(GenericSymbolTableCollection *st); // initializes st
PascalSymbolGenerator(void) {}
// ~PascalSymbolGenerator(void) {} // <== warning if used
};
只要构造函数/析构函数是无效的,将析构函数声明为受保护就没有问题。当类使用堆时会出现问题(析构函数被声明为受保护的,无法将类从“外部”中释放出来,使对象“坚不可摧”)。 有没有更方便的方法(除了一路公开)?
【问题讨论】:
-
为什么要保护析构函数?
-
这只是界面必须完全对用户进行限制的情况。
-
> 你能进一步澄清你的问题吗? > 为什么你想要一个公共构造函数和一个受保护的析构函数? > 由于析构函数应该是虚拟的.. 这样当你销毁子类的 Object 时,它会调用基类的析构函数。
-
这只是一个例子(我的接口构造函数/析构函数都是无效的)。我对他们不感兴趣的案例感兴趣。
-
@Sebi,我不太确定我是否遵循您的推理。您是说要将对象层次结构的使用限制为仅允许使用派生类的实例吗?如果是这样,使析构函数受保护是错误的方法。
标签: c++ eclipse methods virtual