在讨论密封类时,经常提到术语“虚函数表”。究竟是什么?我刚才读到一个方法表(我不记得这个目的的目的)和谷歌/搜索这里带来了C ++相关的结果。
由于
答案 0 :(得分:22)
“虚函数表”或“虚方法表”是每个类具有的方法指针列表。它包含指向类中虚拟方法的指针。
类的每个实例都有一个指向表的指针,当您从实例调用虚方法时使用该指针。这是因为对虚方法的调用应该调用与实际对象的类相关联的方法,而不是对象的引用类。
例如,如果你有一个字符串的对象引用:
object obj = "asdf";
并调用虚方法ToString:
string text = obj.ToString();
它将使用String.ToString方法,而不是Object.ToString方法。它使用String类的虚方法表(字符串实例中的指针指向),而不是Object类的虚方法表。
答案 1 :(得分:6)
C#虚函数表与C ++函数表基本相同,因此任何描述C ++虚函数表如何工作的资源都可以帮助你很好地使用C#。
例如,Wikipedia's description并不错。
答案 2 :(得分:1)
虚拟功能表(通常称为vtable)的定义在C#和C ++中是相同的。它是运行时在内部使用的查找表,用于实现abstract / virtual / override方法的多态行为。
简单来说,你可以想象一个带有虚方法A的基类将有一个包含methodA的vtable。当派生类重写方法A时,methodA的vtable继承自父类,但现在将指向派生类中的methodA而不是父类。