每个实例都有虚拟表或每个对象?

时间:2010-10-27 13:51:21

标签: c# c++

我已经阅读过关于这个metrial的内容,我仍然不明白它的核心 例如:

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的条目,所以每个实例都有自己的虚拟表吗?

每个对象都有自己的虚拟表吗?

3 个答案:

答案 0 :(得分:1)

通常,每种类型只有一个vtable,然后每个对象都包含一个指向它的类型vtable的指针。但是,我认为大多数继承实现都是未定义的 - 也就是说,它可以以它选择的任何方式实现。

答案 1 :(得分:1)

全面概述了CLR如何处理here

  

CLR如何创建运行时对象

对于C ++,它是implementation-defined - @ DeadMG的答案是一个很好的一般准则,尽管有一些有趣的边缘情况,如multiple inheritanceinline virtual functions

答案 2 :(得分:0)

虚拟表与对象的类型(即类)相关联。但是每个对象(引用类型的实例)都有一个指向其类型的指针,因此间接指向它的vtable。

如果您对C#感兴趣,这里有一篇简洁的文章描述了.NET CLR内部结构:CodeProject .NET Type internals