2011-03-30 105 views
37

純虛函數(當我們設置= 0時)也可以有一個函數體。C++純虛函數有正文

如果純虛擬函數根本不會被調用,那麼爲純虛函數提供函數體有什麼用?

+0

[實施與純虛函數]的可能重複(http://stackoverflow.com/questions/2089083/pure-virtual-function-with-implementation) – 2011-03-30 08:13:51

+0

抱歉!我對這個論壇的條款有點新鮮。我已經接受了我所發現的正確答案。感謝suggesssions。 – Vijay 2011-03-31 06:55:30

+0

[純虛函數與實現]可能重複(https://stackoverflow.com/questions/2089083/pure-virtual-function-with-implementation) – finnw 2017-05-31 12:29:09

回答

59

你假設純虛函數不能被調用是絕對不正確的。當一個函數被聲明爲純虛函數時,它僅僅意味着該函數不能通過虛擬調度機制動態調用。然而,這個非常相同的功能可以很容易地被稱爲靜態,沒有虛擬調度。當在呼叫中使用的函數的一個合格的名稱被執行以一個虛函數

在C++語言靜態調用,當在呼叫指定的功能的名稱具有即<class name>::<function name>形式。

例如

struct S { 
    virtual void foo() = 0; 
}; 

void S::foo() { 
    // body for the pure virtual function `S::foo` 
} 

struct D : S { 
    void foo() { 
    S::foo(); // static call to `S::foo` from derived class 
    } 
}; 

int main() { 
    D d; 
    d.S::foo(); // another static call to `S::foo` 
} 
4

對於大多數純虛函數,你會是對的。但是,對於純粹的虛擬析構函數,定義相應的析構函數實際上很重要:

  • 「純虛擬」是要求派生類實現其析構函數。
  • 您的基類析構函數的實現使派生類的析構函數可以成功地「連鎖」。
+8

(我意識到這個答案是一歲,但我只是看到一個鏈接指向這個問題的人,所以...)你的第一點是錯誤的,一個純粹的虛擬析構函數不強制派生類實現析構函數。派生類將始終具有析構函數,即使它是隱式定義的。純虛擬析構函數的一個優點是,如果它沒有其他適合純虛擬函數的函數,則將它作爲抽象類。 – 2012-05-28 18:01:21

19

「有效的C++」邁爾斯提到的理由爲純虛函數 有身體:派生類 實現這個純虛函數 可以調用這個實現在自己的代碼smwhere 。如果部分代碼 有兩個不同的派生類是 類似,那麼即使 函數應該是純虛擬的,它在層次結構中向上移動 也是有意義的。

參見here