2011-05-12 49 views
0

當閱讀一個或另一個提升庫的文檔時,我遇到了一些提示,提示virtual關鍵字有點邪惡。見http://www.boost.org/doc/libs/1_46_1/libs/msm/doc/HTML/ch03s05.html,例如:爲什麼所有關於虛擬關鍵字的模糊?

它不會說MSM強制虛擬關鍵字了你的喉嚨!

根據http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.4,虛擬關鍵字真的不是那麼糟糕,我對它的感覺是一樣的。

爲什麼一些助推人員將虛擬功能調用視爲有史以來最糟糕的事情?我有一個印象,那就是C++的增強專家們真的是專家,所以一定有一些關於它的東西。

+2

你做出了一個錯誤的結論,在該文檔中並沒有說「虛擬關鍵詞是邪惡的」。 – Andrey 2011-05-12 17:26:10

+2

投票結束:我不認爲有人說「虛擬」是「邪惡」(或類似的東西),所以這個問題有些難以回答。 – 2011-05-12 17:27:07

+1

我不認爲你引用的文字是爲了暗示虛擬關鍵字是「邪惡的」。它說:「你可能想要非虛擬地調用當前活動狀態的方法」,所以我認爲「不強迫虛擬喉嚨」的意思是「允許你使用非虛擬的」。非虛函數具有用途的事實並不意味着虛擬是邪惡的。 – 2011-05-12 17:28:00

回答

3

存在靜態多態性優於動態多態性的情況。這就是Christophe在這裏所說的。而已。

0

我認爲推論是MSM不會通過它的內部工作原理或結構強迫你將自己的代碼的成員聲明爲虛擬的或者覆蓋它們。有些庫需要這個,例如動態創建你的類的代理的庫,例如mock或lazy-loaders。

+0

你可以舉一個這樣的圖書館的例子或參考?我會對這將如何工作感興趣。 – theDmi 2011-05-12 18:20:10

+0

我沒有C++示例,但在.NET領域,NHibernate ORM需要映射域類來聲明所有成員都是虛擬的,因此它可以創建延遲加載代理。 – KeithS 2011-05-12 18:46:59

1

運行時多態性有額外的成本,即vtable。一旦vtable被添加到一個類型中,它就不能被刪除。 C++的核心優勢之一是「你只需付出你所用的東西」。因此,爲儘可能保持對象儘可能精簡,有些庫儘可能避免虛擬函數。不是因爲它是邪惡的,而是因爲你可能不需要它。

+0

是的,我明白了,請看問題中的鏈接。 – theDmi 2011-05-12 18:21:13