【问题标题】:virtual table every instance get's on or every object?每个实例都在或每个对象上的虚拟表?
【发布时间】:2010-10-27 13:51:21
【问题描述】:

我已经读过这个金属,但我仍然不明白它的核心 例如:

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

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

【问题讨论】:

标签: c# c++


【解决方案1】:

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

【讨论】:

  • @Steve Townsend:虽然 OP 的代码只有 C#,但它对两者都有效,afaik。
【解决方案2】:

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

CLR 如何创建运行时对象

对于 C++,它是 implementation-defined - @DeadMG 的答案是一个很好的通用指南,尽管有一些有趣的极端情况,例如 multiple inheritanceinline virtual functions

【讨论】:

  • +1 用于定义的实现:我看到 vftables 被内联到对象中,而不是指向正在设置的 vftable 的指针,iirc 来自一些狡猾的 msvc 代码或其他东西......
  • @Necrolis - 可能是由于 Microsoft 特定的 __declspec(novtable) - msdn.microsoft.com/en-us/library/k13k85ky(v=VS.100).aspx。另一个极端情况,谢谢。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 2020-10-18
    • 2010-10-08
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2012-01-21
    相关资源
    最近更新 更多