我已经阅读过关于这个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的条目,所以每个实例都有自己的虚拟表吗?
每个对象都有自己的虚拟表吗?
答案 0 :(得分:1)
通常,每种类型只有一个vtable,然后每个对象都包含一个指向它的类型vtable的指针。但是,我认为大多数继承实现都是未定义的 - 也就是说,它可以以它选择的任何方式实现。
答案 1 :(得分:1)
全面概述了CLR如何处理here。
CLR如何创建运行时对象
对于C ++,它是implementation-defined - @ DeadMG的答案是一个很好的一般准则,尽管有一些有趣的边缘情况,如multiple inheritance和inline virtual functions。
答案 2 :(得分:0)
虚拟表与对象的类型(即类)相关联。但是每个对象(引用类型的实例)都有一个指向其类型的指针,因此间接指向它的vtable。
如果您对C#感兴趣,这里有一篇简洁的文章描述了.NET CLR内部结构:CodeProject .NET Type internals。