虚方法表

时间:2010-03-09 23:43:14

标签: c# .net virtual vtable

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

由于

3 个答案:

答案 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而不是父类。