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

C++ 在只有参数化构造函数的类中,vptr(虚拟指针)在哪里初始化?,c++,polymorphism,virtual-functions,vptr,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-&g

假设我有一节这样的课

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;
        }
};
类基
{
私人:
int i;
int j;
公众:
基地(国际一级)
{
这个->i=i;
j=0;
}
基数(整数i,整数j)
{
这个->i=i;
这->j=j;
}
虚空f()
{

Cuth

每个构造函数将首先初始化 VPTR 伪字段。可以想象它是每个C++类的第一个隐藏字段,其中有一些<代码>虚拟< /COD>成员函数。


理论上,在没有虚拟表指针的情况下实现虚拟函数是可能的,但是我不知道普通的C++实现是这样做的。

< P>每个构造函数都会首先初始化< C++ > VPTR 伪域。 理论上,在没有虚拟表指针的情况下实现虚拟函数是可能的,但是我不知道普通C++实现了什么。 在只有参数化构造函数的类中初始化的vptr(虚拟指针)在哪里?

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

比如:

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

 }
< P>强> <强> C++ FAQ解释了到底发生了什么。 在只有参数化构造函数的类中初始化的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解释了到底发生了什么。

为什么你对默认构造函数赋予了一些特别的重要性?所有的构造函数都以同样的方式初始化VPTR。在这方面,默认的没有什么特别的。@安德烈:我并不认为所有的构造函数都会初始化VPTR。r看到答案,我的疑问就消除了。为什么你要特别重视默认构造函数?所有构造函数都以完全相同的方式初始化vptr。默认构造函数在这方面没有什么特别之处。@AndreyT:我没想到所有构造函数都会初始化vptr。后来,在看到答案后,我的疑问就消除了已清除。