gpt4 book ai didi

c++ - 虚函数的 Vtable 是如何工作的

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:04:58 25 4
gpt4 key购买 nike

我对 Virtual Table 有一个小疑问,每当编译器遇到类中的虚函数时,它都会创建 Vtable 并将虚函数地址放在那里。对于继承的其他类,情况类似。它是否在每个指向每个 Vtable 的类中创建一个新指针?如果不是,当创建派生类的新实例并将其分配给 Base PTR 时,它如何访问虚函数?

最佳答案

每次你创建一个包含虚函数的类,或者你从包含虚函数的类派生,编译器为该类创建一个唯一的 VTABLE。

如果你不要覆盖在基类中声明为虚拟的函数,编译器使用基类版本的地址派生类。

然后它将 VPTR 放入类(class)。使用简单时,每个对象只有一个 VPTR继承。 VPTR 必须初始化为指向适当的 VTABLE 的起始地址。 (这发生在构造函数。)一旦 VPTR 被初始化为正确的 VTABLE,对象在effect“知道”它是什么类型。但这种自知毫无值(value)除非在调用虚函数时使用它。当你通过基类地址调用虚函数时(编译器没有所有信息的情况执行早期绑定(bind)所必需的),会发生一些特别的事情。而不是执行典型的函数调用,这只是一个汇编语言 CALL 到特定地址,编译器生成不同的代码来执行函数调用。

关于c++ - 虚函数的 Vtable 是如何工作的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10065088/

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