2009-08-21 21 views
7

我只是來了解虛擬和Override的是使用了(我找不到這麼長時間使用)的後面。 現在我在工廠模式中使用它們。所以我的問題是Virtual和Override在幕後做了什麼?我願意接受IL和機器代碼。什麼是虛擬和覆蓋做現場

回答

15

我不能給你任何見解,它是如何在IL完成,但基本的原理很簡單。

當編譯器看到的代替方法附接到類虛擬方法聲明,它把它添加到所謂的vtable(虛擬方法表),選擇那些類,其保持指針的功能。

現在,由於vtable是類的一部分,它的子類繼承,因此虛擬方法也被繼承。現在出現覆蓋位。當編譯器看到的覆蓋在方法聲明中,它看起來了vtable,發現要覆蓋的方法,因此它指向新的定義改變了函數指針。

因此,你既是從父類的方法繼承和更改子類及其定義的能力。

欲瞭解更多信息,請參閱Virtual Method Table維基百科的文章。

+1

很好的解釋! – Chris 2009-08-21 06:28:00

+0

難道是vtable中的方法實際上被鏈接而不是被覆蓋?我的目標是從覆蓋方法,我們可以調用基地重寫的方法。 – 2009-08-21 06:44:35

+0

我認爲鏈是隱含的繼承。當你調用基本方法時,實際上是查找由基類定義的虛方法的定義並調用該方法。實際上,您可以查找基類的vtable並使用它。這就是爲什麼你需要使用base調用它,以便編譯器知道去哪裏看。 – paracycle 2009-08-21 07:01:01

4

你不需要去到IL - virtualoverride包括被稱爲polymorphism知名的面向對象的概念。有效地,當多晶型方法或屬性被訪問,該方法/屬性實際上適用在運行時僅確定。爲找到正確的方法,基於所述運行時類型的查找表 - 引擎蓋下的,基本上,正確的方法(在一個屬性的情況下,這是一個方法爲好)是通過訪問一個虛擬方法表確定。

4

如果你有興趣的IL,使用程序Ildasm.exe來看看編譯的程序(DLL或EXE)。你會發現你標記爲「虛擬」的方法在IL中被簡單地標記爲「虛擬」。

神奇發生在運行時。 CLR構建一個「方法調度表」(或「虛擬方法表」),它用來在內存中定位你的類的方法。爲了允許多態性,根據運行時類型,相同的方法名意味着不同的事情,虛擬方法需要一些額外的查找。 (有人可能會說,他們被稱爲「虛擬」的方法,恰恰是因爲他們是「由憑藉」選擇的,他們正在以—但看到@帕維爾的意見是什麼。)Joe Duffy這樣說:

虛方法電話是非常 像一個普通的電話,除了它 必須基於「這個」對象中查找調用的目標在 運行。

這些都是基礎知識。如果你真的想更進一步,Don Box是很好的閱讀。

+0

這是一個有趣的'虛擬'的詞源,但我會很好奇,如果這是一個回顧性的解釋(就像VB的'昏暗'被解釋爲'聲明在內存中'有些日子 - 最初它來自'DIMension',並只用於數組),或真實的東西;如果是後者,你有沒有參考?我知道,在這個精確的意義上,「虛擬」首先出現在第一個OO語言Simula-67中。但我不記得看到關於該語言參考中的關鍵字的解釋... – 2009-08-21 07:32:16

+0

好吧,所以我要出去在那邊......但我覺得很安全。內存聲明是我的新內容 - 我只知道它是舊的數組維度關鍵字。無論如何,很高興聽到一個同胞linguaphile。 – harpo 2009-08-21 07:46:50

+0

我相信我找到了。 「虛擬」是「虛擬量」的縮寫。他們之所以這麼稱呼是因爲他們最初設想了主要用於屬性的機制。請參閱http://books.google.com/books?id=6f-8ZhMO3ScC&lpg=PA104&ots=EDFoUJSTBK&dq=simula%20%22virtual%20quantity%22&pg=PA105#v=onepage&q=virtual&f=false – 2009-08-21 19:46:48