其中,在只有参数化构造函数的类中初始化的 VPTR(虚拟指针)

where is the vptr (virtual pointer) initialized in a class having only parameterized constructors?

本文关键字:VPTR 初始化 虚拟 指针 其中 参数 构造函数      更新时间:2023-10-16

假设我有一个这样的类

class Base
{
    private:
        int i;
        int j;
    public:
        Base(int i)
        {
            this->i = i;
            j = 0;
        }
        Base(int i, int j)
        {
            this->i = i;
            this->j = j;
        }
        virtual void f()
        {
            cout<<"in base f()"<<endl;
        }
};

VPTR 在构造函数的开头进行初始化。但在这种情况下,没有默认构造函数,只有 2 个参数化构造函数。VPTR 将在哪里初始化?

在只有参数化构造函数的类中,vptr(虚拟指针)在哪里初始化?

严格来说,这是完全实现定义的。
然而,几乎已知的编译器通过 vptr 和逆表机制实现动态调度。所有这些编译器都将初始化 vptr 以指向每个构造函数的成员初始化列表中的自己的 v-table。

像这样:

Base::Base(...arbitrary params...)
   : __vptr(&Base::__vtable[0])  ← supplied by the compiler, hidden from the programmer
 {
 }

这个C++常见问题解答解释了究竟发生了什么的要点。

每个构造函数将首先初始化伪字段vptr。您可以想象它是每个具有一些virtual成员函数的C++类的第一个隐藏字段。

理论上可以在没有虚拟表指针的情况下实现虚函数,但我不知道这样做的常见C++实现。