[英]How does a pointer to a Base class which initialized by a derived class can have *__vptr called the right virtual function?
[英]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
伪字段。 您可以想象它是每个具有某些virtual
成员函数的C ++类的第一个隐藏字段。
从理论上讲,可以在没有虚拟表指针的情况下实现虚拟功能,但是我不知道普通的C ++实现会这样做。
在仅具有参数化构造函数的类中,vptr(虚拟指针)在哪里初始化?
严格来说,这是完全实现的定义。
但是,几乎所有已知的编译器都通过vptr和v-table机制实现动态调度。 所有这些编译器都将初始化vptr,以指向每个构造函数的成员初始化列表中的自己的v表。
就像是:
Base::Base(...arbitrary params...)
: __vptr(&Base::__vtable[0]) ← supplied by the compiler, hidden from the programmer
{
}
此 C ++常见问题解答说明了实际发生的要点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.