2010-10-27 71 views
0

我看了一下這個metrial,我仍然不明白它的核心 如:虛擬表每個實例get或on的每個對象?

public static void Main() 
{ 
    person []p = new person[]{new student(),new worker()}; 
} 

public class person 
{ 
    public void f1() { } 
    public virtual void f2() { } 
} 
public class student:person 
{ 
    public override void f2() { } 
} 

public class worker:person 
{ 
    public override void f2() { } 
} 

確實P [0]有它自己的虛擬表作爲一個實例,因此P [1]與F2一個條目所以每個實例都有它自己的虛擬表?

每個對象都有它自己的虛擬表嗎?

+0

由於OP的代碼只有C#,因此刪除了C++標記。 – Puppy 2010-10-27 13:58:03

+1

@DeadMG @DeadMG這個問題是他們兩個甚至thoght的例子是C# – 2010-10-27 13:59:31

+0

另請參閱相關問題在這裏 - - http://t./tccoverflow.com/questions/3634660/how-are-vtables-implemented-in-c-and-c – 2010-10-27 14:40:28

回答

0

虛擬表綁定到對象的類型(即類)。但是每個對象(引用類型的實例)都有一個指向其類型的指針,因此間接指向它的vtable。

如果您對C#感興趣,這裏有一篇整潔的文章,它描述了.NET CLR內部:CodeProject .NET Type internals

1

通常,每個類型只有一個vtable,然後每個對象包含一個指向其類型的vtable的指針。但是,我相信大多數繼承實現都是未定義的,即它可以以任何它選擇的方式實現。

+0

C++或C#響應? – 2010-10-27 13:55:17

+0

@Steve Townsend:雖然OP的代碼只有C#,但它對於afaik都是有效的。 – Puppy 2010-10-27 13:57:41

1

CLR處理這個here有一個全面的概述。

的CLR如何創建運行時對象

對於C++是implementation-defined - @ DeadMG的回答是一個很好的一般原則,但也有有趣的邊緣情況下,像multiple inheritanceinline virtual functions

+0

用於定義實現的+1:我已經看到vftables被內聯到對象中,而不是被指向被設置的vftable的指針,iirc來自一些狡猾的msvc代碼或者其他東西... – Necrolis 2010-10-27 14:52:53

+0

@Necrolis - 可能是由於特定於Microsoft的' __declspec(novtable)' - http://msdn.microsoft.com/en-us/library/k13k85ky(v=VS.100).aspx。另一個邊緣情況,謝謝。 – 2010-10-27 14:59:46