2012-11-28 208 views
4

換句話說,爲什麼編譯器不知道如果函數的定義在派生類中改變了,並且指向該派生類的動態分配內存的指針調用更改後的函數,那麼函數在特別應該被調用,而不是基類的?爲什麼需要virtual關鍵字?

在什麼情況下不會讓虛擬關鍵字符合程序員的利益?

+4

不使用'虛擬'的好處?沒有開銷! –

+0

不確定我有確定的答案,但是存在任何虛擬關鍵字意味着虛擬指針表將在運行時建立,這可能會導致性能下降。 – ScoPi

+0

http://en.wikipedia.org/wiki/Virtual_method_table –

回答

6

virtual關鍵字告訴編譯器實現動態調度。這就是語言的設計。 沒有這樣的關鍵字,編譯器就不知道是否實現動態分派。

virtual缺點或動態分配一般是,

  • 它有輕微的性能損失。大多數編譯器會使用vtable和vptr機制實現動態分派,其中通過vtable決定調用的適當函數,因此在動態分派的情況下需要額外的間接尋址。
  • 它使你的班級非POD。
+2

與非虛擬函數相比,虛擬函數具有「開銷」,與二分法搜索速度快於Quicksort相同。比較沒有意義,因爲他們做了不同的事情。如果您需要動態分派,您可以使用虛擬功能,也可以實施自己的動態分派機制,這與虛擬功能一樣「緩慢」。 – fredoverflow

+0

@FredOverflow:我同意這個概念,馬匹的課程。如果你需要動態分派功能,你需要爲靜態綁定函數支付一點功能。同意,它有點像比較蘋果和梨。 –

+0

我喜歡蘋果,順便說一下;) – fredoverflow

0

編譯器不知道,因爲它不能。這可能是你的目的,不使用虛擬功能,因爲每個功能都有相關的成本。

+0

你真的要付出一些你想要的東西。必須要給的東西。 –

2

原因之一:

考慮位於獨立模塊中的基類,如庫。

和您的應用程序中的派生類。

在編譯庫時,編譯器如何知道給定函數是/必須是虛擬的。

+0

我認爲這是解決OP問題的最佳答案。編譯器不能*猜測*一個方法在編譯類時是否會被虛擬*使用。 –

相關問題