假设我有一个这样的课程
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将在何处初始化?
答案 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 ++常见问题解答解释了究竟发生了什么。