其中,在只有参数化构造函数的类中初始化的 VPTR(虚拟指针)
where is the vptr (virtual pointer) initialized in a class having only parameterized constructors?
假设我有一个这样的类
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++实现。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 同时具有"聚合初始化"和"模板推导"
- 初始化具有非默认构造函数的std::数组项的更好方法
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 在C和C++中初始化结构中的数组
- 何时为派生类初始化 vptr?
- 如何在编译时初始化 vptr
- 其中,在只有参数化构造函数的类中初始化的 VPTR(虚拟指针)