2012-07-15 65 views
26

在C++ 11,我们能够声明析构函数是自动生成的:默认纯虚析

struct X { 
    virtual ~X() = default; 
}; 

另外,我们可以声明析构函数是纯虚:

struct X { 
    virtual ~X() = 0; 
}; 

我的问题是:如何声明析构函数为均为自动生成纯虚拟?看起来像下面的语法不正确:

struct X { 
    virtual ~X() = 0 = default; 
}; 

这也不是一:

struct X { 
    virtual ~X() = 0, default; 
}; 

这也不之一:

struct X { 
    virtual ~X() = 0 default; 
}; 

编辑: 一些澄清问题的目的。基本上我想空的类是不可实例化的基类,但派生类是可实例化的,那么类必须有一个纯虚拟析构函数。但另一方面,我不想在.cpp文件中提供定义。所以我需要一些相当于default的机制。我想知道有没有人有解决这个问题的想法。

+2

你能做到'虚拟〜X()= 0 {}'?现在再想想你想做什么。 – Xeo 2012-07-15 18:20:03

+4

@Xeo:是的,你可以。但不是用那种语法;您必须提供非内联实现。任何纯虚函数都可能有一个默认实现 - 这仅仅意味着非抽象派生类*必须*实现该函数,但可能会调用父类的默认实现作为其实现的一部分。 – JohannesD 2012-07-15 18:22:10

+1

@JohannesD:我知道,看到我对Michal的答案的评论,但是'= default'基本上是{}}课堂上的(如果你没有成员)。 – Xeo 2012-07-15 18:23:09

回答

39

为了定义纯虚拟方法,您需要声明中的单独定义。

因此:

struct X { 
    virtual ~X() = 0; 
}; 

X::~X() = default; 
+0

以下是成功编译的[Ideaone示例链接](http://ideone.com/Y4iPA)。 – 2012-07-15 18:57:36

+0

darn,当我得到我有效的C++副本时(在使用旧语法时显示),你击败了我吧 – 2012-07-15 18:57:43

+3

这个答案不正确!你仍然需要放入'X ::〜X()= default; '到.cpp文件中,否则会出现'multiple definition'链接错误。 – 2012-07-16 00:14:35