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

时间:2012-11-22 07:16:51

标签: c++ polymorphism virtual-functions vptr

假设我有一个这样的课程

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将在何处初始化?

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:3)

  

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

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

类似的东西:

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

 }

This C ++常见问题解答解释了究竟发生了什么。