37
A
回答
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。
相關問題
- 1. C++ - 純虛函數
- 2. C++純虛函數
- 3. C++多態/純虛函數
- 4. 純虛函數
- 5. 純虛函數
- 6. 純虛函數重寫虛函數
- 7. 在非純虛函數中使用純虛函數的C++抽象類
- 8. C++:在非虛函數中使用純虛函數
- 9. C++前向聲明和純虛函數
- 10. C++繼承虛擬純函數
- 11. C++ 17中的純虛函數體?
- 12. 正確放置在默認的純虛析構函數C++ 11
- 13. 純虛函數錯誤
- 14. 純虛函數和繼承
- 15. 純虛擬函數調用
- 16. 純虛函數XCode中
- 17. 純虛函數派生類
- 18. 純虛函數調用error
- 19. 編譯時純虛函數
- 20. 繼承和純虛函數
- 21. R6025純虛函數調用
- 22. Qt純虛函數錯誤
- 23. 純虛類C++
- 24. 純虛函數和子函數++未使用的參數用C
- 25. 沒有純虛函數的C++抽象類?
- 26. 多態C++與純虛函數析構函數
- 27. C++用函數指針覆蓋純虛函數
- 28. C++純虛方法
- 29. 純函數C++ 11
- 30. 虛函數(C++)
[實施與純虛函數]的可能重複(http://stackoverflow.com/questions/2089083/pure-virtual-function-with-implementation) – 2011-03-30 08:13:51
抱歉!我對這個論壇的條款有點新鮮。我已經接受了我所發現的正確答案。感謝suggesssions。 – Vijay 2011-03-31 06:55:30
[純虛函數與實現]可能重複(https://stackoverflow.com/questions/2089083/pure-virtual-function-with-implementation) – finnw 2017-05-31 12:29:09