Resolving of vptr

Resolving of vptr

本文关键字:vptr of Resolving      更新时间:2023-10-16
class base {
public:
    virtual void fn(){}
};
class der : public base {};

我知道编译器在类中提供了一个成员调用 VPTR,该成员调用由构造函数在运行时使用确切的 VTABLE 初始化。我有 2 个问题

1( 哪个班级持有 VPTR。或者所有类都有单独的 VPTR。

2( 执行语句时der d;如何在运行时解析 VPTR?

vtable是为

包含虚函数的类和从虚函数派生的类创建的。这意味着在您的程序中vtable将为base类和der类创建。这些vtables中的每一个都将包含虚拟函数void fn()的地址。现在请注意der类不包含void fn()的定义,因此其vtable包含base类的void fn()函数的地址。因此,如果您进行像d.fn();这样的调用,则base类的void fn()函数将被执行。

注意:虚拟表和虚拟指针是实现细节,尽管我认识的所有C++编译器都使用它们,但它们不是标准强制要求的,只有结果是。

要回答您的特定问题:具有虚拟方法(自己的或继承的方法(的类的每个实例或具有(某处(虚拟继承关系的类至少需要一个虚拟指针。

可以有多个(当涉及虚拟继承或多重继承时(。

在您的示例中,单个虚拟指针就足够了。但是,将其称为class的一部分是没有意义的。虚拟指针是实例(对象(的一部分,位于类规则之外,因为这些规则适用于语言,而虚拟指针是一种实现机制。

1(哪个类拥有VPTR。或者所有类都有单独的 VPTR。

如果class是多态的(即包含virtual函数或具有virtual继承(,则每个class对象都有自己的vptr。在这种情况下,两个类都具有virtual函数。

2( 在执行语句 der d 时;VPTR 在运行时是如何解析的?

你只是在声明der的对象。但即使你调用了一个函数,那么在这种情况下,对任何函数的调用都是在编译时解析的。仅当使用指针/引用调用函数时,虚函数解析才会出现。