虚方法表

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

谢谢

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

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

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

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

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

object obj = "asdf"; 

并调用虚方法ToString:

 string text = obj.ToString(); 

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

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

简单地说,你可以想象一个带有虚方法A的基类将有一个包含methodA的vtable。 当派生类重写方法A时,methodA的vtableinheritance自父类,但现在将指向派生类中的methodA而不是父类。