c# - vtables是如何在c++和c#中实现的?

标签 c# c++ inheritance interface vtable

让我们有这种情况(在 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/

相关文章:

c# - 如何指定属性应生成 TEXT 列而不是 nvarchar(4000)

c++ - 是否可以在邻接列表中删除我的 Boost Graph 中的顶点?

c# - 在 linq 中使用数据透视表

c# - 当最后一个方法调用是有条件的时,为什么 C# 编译器会删除一连串的方法调用?

c++ - 如何在方法模板中使用模板类型的引用传递参数?

c++ - 在声明和类名的定义中使用不同的类键是否合法?

spring - 如何在没有继承的情况下在我的测试中共享 @MockBeans 和模拟方法?

java - 在java中使用mockito模拟子类项

java - 从父类(super class)型的扩展列表中返回子类型对象的列表

c# - 字符串连接和@