2010-10-27 70 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