gpt4 book ai didi

C++虚拟表查找 - 它如何搜索和替换

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:05:46 26 4
gpt4 key购买 nike

让我们举个例子:

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 查找将无法工作。编译器确实会破坏所有虚函数名称,因此它必须是一个经过破坏的名称,这是否意味着如果它是虚函数,则 base 和 derived 的经过破坏的名称是相同的。

最佳答案

虚拟表只是函数指针数组,就像您的第二个片段一样。编译器将对虚函数的调用翻译成通过指针调用,例如

Base * b = /* ... */;
b->function2();

被翻译成

b->__vtable[1]();

我在此处使用名称 __vtable 来引用虚拟表(但请注意,虚拟表通常无法直接访问)。

表中条目的顺序由函数在类中声明的顺序决定。请记住,类定义在调用时始终可用。

关于C++虚拟表查找 - 它如何搜索和替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8005791/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com