在讨论密封类时,经常提到“虚函数表”这个术语。它是什么?我之前读过一个方法表(我也不记得它的目的是什么了),在这里进行谷歌/搜索会出现与C++相关的结果。
谢谢。
"虚函数表"或者 "虚方法表" 是每个类拥有的方法指针列表。它包含了类中虚方法的指针。
每个类的实例都有一个指向该表的指针,在从实例调用虚方法时使用。这是因为调用虚方法应该调用与实际对象的类相关联的方法,而不是与对象引用的类相关联的方法。
例如,如果你有一个指向字符串的对象引用:
object obj = "asdf";
并调用虚方法 ToString:
string text = obj.ToString();
它将使用String.ToString方法,而不是Object.ToString方法。它使用的是String类的虚拟方法表(指向字符串实例的指针),而不是Object类的虚拟方法表。虚函数表(常称为vtable)的定义在C#和C++中是一致的。它是一个由运行时内部使用的查找表,用于实现抽象/虚拟/覆盖方法的多态行为。
简单地说,你可以想象一个具有虚方法A的基类将拥有一个包含方法A的vtable。当派生类重写方法A时,方法A的vtable继承自父类,但现在会指向派生类中的方法A而不是父类中的方法A。
string text = obj.ToString();
的 IL 代码是:callvirt instance string [mscorlib]System.Object::ToString()
,因此它似乎实际上并没有使用String.ToString
。 - OfirD