0

假设我有这样的课

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 将在哪里初始化?

4

2 回答 2

3

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

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

于 2012-11-22T07:18:42.547 回答
3

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

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

就像是:

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

 }

这个C++ FAQ 解释了到底发生了什么。

于 2012-11-22T07:20:15.403 回答