繁体   English   中英

在仅具有参数化构造函数的类中,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伪字段。 您可以想象它是每个具有某些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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM