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. 純虛函數
- 2. 純虛函數
- 3. C++ 17中的純虛函數體?
- 4. C++前向聲明和純虛函數
- 5. 正確放置在默認的純虛析構函數C++ 11
- 6. 繼承和純虛函數
- 7. 純虛擬函數調用
- 8. 純虛函數派生類
- 9. 純虛函數和繼承
- 10. 純虛函數調用error
- 11. 編譯時純虛函數
- 12. 純虛函數XCode中
- 13. R6025純虛函數調用
- 14. Qt純虛函數錯誤
- 15. 純虛函數錯誤
- 16. C++純虛方法
- 17. 從父類調用純虛函數
- 18. 「純虛函數調用」消息框
- 19. Python和純虛函數錯誤
- 20. 純虛擬方法VS.函數指針
- 21. 使用Boost封裝純虛函數:: Python
- 22. 重寫純虛函數時,有沒有使用`override`的意思?
- 23. 虛擬函數C++:虛擬函數已經有一個主體
- 24. 帶有參數錯誤練習的非純虛函數?
- 25. C++ cli純虛函數重載(或禁用?)
- 26. C++使用純虛函數實例化抽象類的子代
- 27. 如何在純虛函數中使用C++類?
- 28. C++共享庫:純虛函數不會導致鏈接錯誤
- 29. 在C++中是否可以定義純虛函數?
- 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