2017-07-03 109 views
4

它什麼都不做的虛擬析構函數是虛擬析構函數=默認與空體之間是否有區別?

virtual ~ClassName() {} 

由於C++ 11 we can alternatively say

virtual ~ClassName() = default; 

有這兩者之間有什麼區別?

+0

@ Rakete1111:實際上它不是重複的,因爲另一個問題是關於默認析構函數是公共的,這個是關於爲什麼在基類中必需的虛析構函數中使用= default而不是{}具有虛擬成員功能。我想知道同樣的事情,也就是說,如果編譯器可以用= default來區分不同的事情,或者它更簡單的C++ 11。畢竟還有不少字符需要輸入。 – Masseman

+0

@Masseman當然,它們並不完全等價。但是他們會問同樣的問題,我應該爲析構函數使用'{}'或'= default;'嗎?析構函數是虛擬的並不重要,因爲這不是問題的關鍵。 – Rakete1111

回答

4

的主要區別在於,存在用於默認的功能的規則,根據它們將被刪除的情況下,其指定(參見ISO C++ 14(N4296)8.4,12.1,12.4,12.8)

8.4。 2.5:顯式默認函數和隱式聲明函數統稱爲默認函數,實現應爲它們提供隱式定義(12.1 12.4, 12.8),這可能意味着將它們定義爲已刪除。

例如:

12.4.5:一類X A拖欠析構函數被定義爲已刪除,如果: (5.1) - X是聯合狀類,它具有一個變體構件具有(5.2) - 任何可能構造的子對象 具有類類型M(或其數組),並且M具有刪除的析構函數或從默認的析構函數不可訪問的析構函數,(5.3) 或一個虛擬的析構函數,查找非數組釋放函數的結果 歧義或在被刪除的功能或 從默認的析構函數

人跡罕至如果您使用屬於被刪除的類別之一,採用default將等同於使用delete{}不會。

相關問題