代码之家  ›  专栏  ›  技术社区  ›  yoav.str

每个实例上的虚拟表或每个对象?

  •  0
  • yoav.str  · 技术社区  · 14 年前

    我读过这个都市报,但我还是不明白它的核心 例如:

    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 回复  |  直到 14 年前
        1
  •  0
  •   vgru    14 年前

    虚拟表绑定到对象的类型(即类)。但每个对象(引用类型的实例)都有指向其类型的指针,因此间接指向其vtable。

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

        2
  •  1
  •   Puppy    14 年前

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

        3
  •  1
  •   Community CDub    8 年前

    有一个关于clr如何处理这个的全面概述 here .

    clr如何创建运行时对象

    对于C++,它是 implementation-defined -@Deadmg的答案是一个很好的通用指南,尽管有一些有趣的边缘案例,如 multiple inheritance inline virtual functions .