虚方法表

Gur*_*epS 18 .net c# virtual vtable

在讨论密封类时,经常提到术语"虚函数表".究竟是什么?我刚才读到一个方法表(我不记得这个目的的目的)和谷歌/搜索这里带来了C++相关的结果.

谢谢

Guf*_*ffa 22

"虚函数表"或"虚方法表"是每个类具有的方法指针的列表.它包含指向类中虚拟方法的指针.

类的每个实例都有一个指向表的指针,当您从实例调用虚方法时使用该指针.这是因为对虚方法的调用应该调用与实际对象的类关联的方法,而不是对象的引用的类.

例如,如果您具有对字符串的对象引用:

object obj = "asdf";
Run Code Online (Sandbox Code Playgroud)

并调用虚方法ToString:

string text = obj.ToString();
Run Code Online (Sandbox Code Playgroud)

它将使用String.ToString方法,而不是Object.ToString方法.它使用String类的虚方法表(字符串实例中的指针指向),而不是Object类的虚方法表.

  • @Spirit:是的,每个类型都有一个方法表(在某个阶段至少以某种形式).由于对值类型的调用是非虚拟的,因此确切的方法在编译时确定,因此它们不需要虚拟方法表,因为它们只需要存在于可执行文件中以用于反射目的.我不知道方法表的实际存储位置,这将依赖于实现,因此您可以查看框架源代码(但实现的那部分可能不公开). (2认同)
  • @HeyJude obj 的编译时类型是 object。由于 ToString 是虚拟的,而 object 是引用类型,因此将使用 callvirt 关键字进行调用。Callvirt 在查看 obj 实例的虚拟方法表后将调用 String.ToString()。看起来它不会调用 String.ToString,但实际上它会调用。 (2认同)

Dea*_*ing 6

C#虚函数表与C++函数表的工作原理基本相同,因此任何描述C++虚函数表如何工作的资源都可以帮助您很好地使用C#.

例如,维基百科的描述也不错.