1樓:
c#不了解。
但是關於c++的說法,這樣是不對的。
題主你其實糾結的不是語言,而是an implementation of c++.
意思是,之所以會有上面的結果,是因為你的編譯器的實現。
在c++標準裡面,對於virtual 的具體實現沒有做任何要求。
而virtual method table只是大多數編譯器的實現。
因為標準沒有做要求,具體的細節上,每個編譯器是可以不同的。
而Virtual在標準裡面,設計者不是希望使用者去思考怎麼implement 它的,而是希望使用者對它的理解是這樣:
不考慮pure virtual .
base中宣告了乙個Virtual 函式,非pure virtual,所以這個函式必須要有定義。
從base class的reference或者pointer,你只能訪問到base的成員!!
但是,如果這個reference或者pointer,真實的型別是乙個子類的。
子類中,只要出現了相同函式(不包括返回值)的定義,那麼它override了自己的base的virtual function!!
所以,設計者,希望你認為的是,call的還是base class裡面的成員!
只是,這個成員被override了。
而不是希望你去考慮,這個背後的實現。
c 靜態成員函式為什麼不能為虛函式?
Elvis Wang 其實我覺得這個問題沒有回答的必要,屬於語言概念層面的東西。class A 首先你要搞清楚什麼是普通成員函式。成員函式是類例項相關的,不同的例項物件呼叫成員函式結果一般都不同。比如,上面的fun1是成員函式,你進行呼叫 A a1 new A A a2 new A a1 fun1 ...
為什麼 C 中使用虛函式時會影響效率?
C 中使用虛函式不會影響效率。你遇到的場景,都沒到需要考慮流水線 friendly 的程度,先把東西寫出來,別想沒用的。 maple 因為查詢虛函式表的時候會有效率損失,可以通過模板的CRTP技術實現靜態繫結,詳見 C CRTP Curiously Recurring Template Patter...
建構函式不能是虛函式
ylq 建構函式不是不能是虛函式,而是完全沒意義。c 在編譯期間就能確定你要建立的物件的具體型別,而這個具體型別包含了什麼,繼承了什麼在編譯期間也是明確的,所以要構造什麼也都是明確的,根本沒必要存在虛建構函式。虛函式的存在是因為編譯期間沒法確定具體呼叫物件,才會有虛函式,虛函式表這麼個東西。 雞賊軒...