【问题标题】:where is the vptr (virtual pointer) initialized in a class having only parameterized constructors?vptr(虚拟指针)在只有参数化构造函数的类中初始化在哪里?
【发布时间】:2012-11-10 13:08:53
【问题描述】:

假设我有这样的课程

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 会在哪里初始化?

【问题讨论】:

  • 为什么要给 default 构造函数赋予一些特殊的重要性?所有构造函数都以完全相同的方式初始化 vptr。在这方面,默认值没有什么特别之处。
  • @AndreyT:我没想到所有构造函数都会初始化 vptr。后来,看到答案后,我的疑惑解开了。

标签: c++ polymorphism virtual-functions vptr


【解决方案1】:

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++ FAQ 解释了到底发生了什么。

【讨论】:

    【解决方案2】:

    每个构造函数都会首先初始化vptr 伪字段。你可以想象它是每个具有virtual 成员函数的 C++ 类的第一个隐藏字段。

    理论上可以在没有虚表指针的情况下实现虚函数,但我知道没有常见的 C++ 实现。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      • 2021-07-03
      • 2015-11-05
      • 2023-03-12
      • 1970-01-01
      相关资源
      最近更新 更多