【发布时间】:2026-02-01 10:50:02
【问题描述】:
举个例子:
class Base{
virtual string function1(){ return "Base - function1"; };
virtual string function2(){ return "Base - function2"; };
};
class Derived : public Base {
virtual string function2(){ return "Derived - function2"; };
virtual string function1(){ return "Derived - function1"; };
string function3() { return "Derived - function3"; };
};
所以vtable结构是这样的
Base-vTable
-----------------------
name_of_function address_of_function
function1 &function1
function2 &function2
-----------------------
-----------------------
Derived-vTable
-----------------------
name_of_function address_of_function
function1 &function1
function2 &function2
或者是这样的
Base-vTable
-----------------------
Offset function
+0 function1
+4 function2
-----------------------
-----------------------
Derived-vTable
-----------------------
Offset function
+0 function1
+4 function2
如果是后者呢?那这个偏移量是多少?用在什么地方?
还有函数名: 它是错位的函数名称吗?如果它被损坏,则基本名称和派生的损坏名称将不匹配,并且 vtable 查找将不起作用。 编译器确实修改了所有的虚函数名称,所以它必须是一个修改过的名称,这是否意味着如果它是虚函数,则基数和派生的修改过的名称是相同的。
【问题讨论】:
-
virtualmechanism 是实现定义的。它没有任何单一的方法。取决于系统。 -
@avakar:我读过一些关于这个主题的论文,特别是为了高效实现多方法,但我知道没有真正的编译器使用它们。通常有更有效的方法(存储方面),但它们也更复杂,而 v-table 足够简单,可以确保下注(编译器编写者也有更多经验)。
-
这篇文章可能对以下主题有所帮助:“C++:幕后”,openrce.org/articles/files/jangrayhood.pdf
-
@David:这篇关于 Eiffel 的论文:Efficient Dynamic Dispatch without virtual Function Tables Olivier ZENDRA、Dominique COLNET 和 Suzanne COLLIN(更具体地说是 3.2 删除虚拟函数表),请注意他们的提议如果我没记错的话,只有“密封”类层次结构才有可能,当你有整个程序分析和模块时,它工作得很好。我不知道我是否见过 C++ 的东西。
-
@MatthieuM.:感谢指点,实际文章是here