让我们有这种情况(在 c++ 中,在 c# 中类 A、B 是接口(interface)):
class A { virtual void func() = 0; };
class B { virtual void func() = 0; };
class X: public A, public B { virtual void func(){ var = 1; } int var;};
X * x = new X; // from what I know, x have 2 vtables, is this the same in c#?
A * a = (A*)x; // a == x
B * b = (B*)x; // here b != x, so when calling b->func(), how is the address of var correct?
C# 编译器是否总是创建一个 vtable?它在转换时是否进行任何指针修正?
最佳答案
不要过于迂腐,但 C# 编译器不会参与此级别。整个类型模型、继承、接口(interface)实现等实际上由 CLR 处理,更具体地说是 CTS(通用类型系统)。 .NET 编译器大多只生成表示意图的 IL 代码,这些代码稍后由 CLR 执行,其中处理所有 Vtable 处理等。
有关 CLR 如何创建和管理运行时类型的一些详细信息,以下链接将是一个很好的起点。最后解释了 MethodTable 和 Interface Maps。
http://web.archive.org/web/20150515023057/https://msdn.microsoft.com/en-us/magazine/cc163791.aspx
关于c# - vtables是如何在c++和c#中实现的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3634660/