換句話說,爲什麼編譯器不知道如果函數的定義在派生類中改變了,並且指向該派生類的動態分配內存的指針調用更改後的函數,那麼函數在特別應該被調用,而不是基類的?爲什麼需要virtual關鍵字?
在什麼情況下不會讓虛擬關鍵字符合程序員的利益?
換句話說,爲什麼編譯器不知道如果函數的定義在派生類中改變了,並且指向該派生類的動態分配內存的指針調用更改後的函數,那麼函數在特別應該被調用,而不是基類的?爲什麼需要virtual關鍵字?
在什麼情況下不會讓虛擬關鍵字符合程序員的利益?
virtual
關鍵字告訴編譯器實現動態調度。這就是語言的設計。 沒有這樣的關鍵字,編譯器就不知道是否實現動態分派。
的virtual
缺點或動態分配一般是,
與非虛擬函數相比,虛擬函數具有「開銷」,與二分法搜索速度快於Quicksort相同。比較沒有意義,因爲他們做了不同的事情。如果您需要動態分派,您可以使用虛擬功能,也可以實施自己的動態分派機制,這與虛擬功能一樣「緩慢」。 – fredoverflow
@FredOverflow:我同意這個概念,馬匹的課程。如果你需要動態分派功能,你需要爲靜態綁定函數支付一點功能。同意,它有點像比較蘋果和梨。 –
我喜歡蘋果,順便說一下;) – fredoverflow
編譯器不知道,因爲它不能。這可能是你的目的,不使用虛擬功能,因爲每個功能都有相關的成本。
你真的要付出一些你想要的東西。必須要給的東西。 –
原因之一:
考慮位於獨立模塊中的基類,如庫。
和您的應用程序中的派生類。
在編譯庫時,編譯器如何知道給定函數是/必須是虛擬的。
我認爲這是解決OP問題的最佳答案。編譯器不能*猜測*一個方法在編譯類時是否會被虛擬*使用。 –
C++的主要設計原理之一是C++ does not incur overhead for features that are not used (the "zero-overhead principle")。這是因爲注重高性能
這就是爲什麼您需要選擇像虛擬功能這樣的功能,而在像Java這樣的語言中,默認情況下功能是虛擬的。
不使用'虛擬'的好處?沒有開銷! –
不確定我有確定的答案,但是存在任何虛擬關鍵字意味着虛擬指針表將在運行時建立,這可能會導致性能下降。 – ScoPi
http://en.wikipedia.org/wiki/Virtual_method_table –