2012-07-15 60 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