Chinaunix首页 | 论坛 | 博客
  • 博客访问: 919648
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

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()
{
}

阅读(1473) | 评论(8) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-23 15:13:58

空见
1. 最好不要让virtual ~Deleteable()声明成纯虚
2. 如果声明成纯虚,那么WinWing的问题就有答案了,因为
析构函数是自动调用的,也就是说派生类的析构函数一定会调用祖先类的析构函数,而不管这个函数是否是纯虚,如果不提供这个纯虚的本地实现就会导致连接的警告。
3. 是否是纯虚只是一个编译指示字(伪指令),并不产生任何代码,这个指示字只是提醒编译器如果遇到了纯虚类的实例声明就提示编译错误,仅此而已。就像第2点中看到的那样,这个指示字不能阻止编译器产生派生类调用祖先纯虚析构器的代码。当然,更不会阻止连接器去连接已经有的实现:)

网友评论2012-11-23 15:13:50

WinWing
请教一下,如果是无关的,那么给出它的实现有什么意义呢?

网友评论2012-11-23 15:13:42

周星星
纯虚 和 是否有实现 是无全无关的。

网友评论2012-11-23 15:13:35

sonicwei
我的感觉是既然是纯虚的,还是不要有实现的好。

网友评论2012-11-23 15:13:28

周星星
谢谢