26

在讨论密封类时,经常提到术语“虚函数表”。这究竟是什么?不久前我读到了一个方法表(我也不记得这个目的的目的),并且在此处进行谷歌/搜索会显示与 C++ 相关的结果。

谢谢

4

3 回答 3

32

“虚函数表”或“虚方法表”是每个类拥有的方法指针列表。它包含指向类中的虚拟方法的指针。

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

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

object obj = "asdf";

并调用虚拟方法 ToString:

string text = obj.ToString();

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

于 2010-03-09T23:50:51.240 回答
7

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

例如,维基百科的描述还不错。

于 2010-03-09T23:46:46.147 回答
2

虚函数表(通常称为 vtable)的定义在 C# 和 C++ 中是相同的。它是运行时内部使用的一个查找表,用于实现抽象/虚拟/覆盖方法的多态行为。

简单来说,您可以想象具有虚拟方法A 的基类将具有包含方法A 的vtable。当派生类覆盖methodA时,methodA的vtable继承自父类,但现在将指向派生类中的methodA而不是父类。

于 2010-03-09T23:49:25.413 回答