2012年(158)
分类: C/C++
2012-11-23 15:12:04
问:
class Deleteable
{
public:
virtual ~Deleteable() = 0
{}
virtual void deleteSelf()
{ delete this;
}
};
在g++3.4.2中为什么无法编译通过(vc++8.0可以)?
答:
ISO/IEC 14882:2003(E)第10.4.2中指出:
[Note: a function declaration
cannot provide both a pure-specifier and a definition
—end note]
[Example:
struct C {
virtual void f() = 0 { }; //
ill-formed
};
—end
example]
所以在这一点上,g++是符合C++标准的,标准方法应当写成:
class
Deleteable
{
public:
virtual ~Deleteable() = 0;
virtual void deleteSelf()
{ delete this; }
};
inline
Deleteable::~Deleteable()
{
}
网友评论2012-11-23 15:13:58
空见
1. 最好不要让virtual ~Deleteable()声明成纯虚
2. 如果声明成纯虚,那么WinWing的问题就有答案了,因为
析构函数是自动调用的,也就是说派生类的析构函数一定会调用祖先类的析构函数,而不管这个函数是否是纯虚,如果不提供这个纯虚的本地实现就会导致连接的警告。
3. 是否是纯虚只是一个编译指示字(伪指令),并不产生任何代码,这个指示字只是提醒编译器如果遇到了纯虚类的实例声明就提示编译错误,仅此而已。就像第2点中看到的那样,这个指示字不能阻止编译器产生派生类调用祖先纯虚析构器的代码。当然,更不会阻止连接器去连接已经有的实现:)