在讨论密封类时,经常提到术语“虚函数表”。这究竟是什么?不久前我读到了一个方法表(我也不记得这个目的的目的),并且在此处进行谷歌/搜索会显示与 C++ 相关的结果。
谢谢
“虚函数表”或“虚方法表”是每个类拥有的方法指针列表。它包含指向类中的虚拟方法的指针。
类的每个实例都有一个指向表的指针,当您从实例调用虚拟方法时会使用该指针。这是因为对虚方法的调用应该调用与实际对象的类相关联的方法,而不是对象引用的类。
例如,如果您有对字符串的对象引用:
object obj = "asdf";
并调用虚拟方法 ToString:
string text = obj.ToString();
它将使用 String.ToString 方法,而不是 Object.ToString 方法。它使用的是 String 类的虚方法表(字符串实例中的指针所指向的),而不是 Object 类的虚方法表。
C# 虚函数表的工作原理与 C++ 表基本相同,因此任何描述 C++ 虚函数表如何工作的资源都应该可以很好地帮助您使用 C# 表。
例如,维基百科的描述还不错。
虚函数表(通常称为 vtable)的定义在 C# 和 C++ 中是相同的。它是运行时内部使用的一个查找表,用于实现抽象/虚拟/覆盖方法的多态行为。
简单来说,您可以想象具有虚拟方法A 的基类将具有包含方法A 的vtable。当派生类覆盖methodA时,methodA的vtable继承自父类,但现在将指向派生类中的methodA而不是父类。