是否跳过了非具体类的虚拟类的基本构造函数?

时间:2015-05-27 05:25:06

标签: c++

我有这段代码:

class Base{
public:
  int x;
  Base(int x){
    this->x = x;
  }

  virtual ~Base(){
    cout<<"base destroyed"<<endl;
  }
};

class A: public virtual Base{
public:
  A(int x) : Base(x){   //is this base call here skipped?
  }

  virtual ~A(){
    cout<<"a has been destroyed"<<endl;
  }
};

class B: public A{
public:
  B():Base(10),A(12){      //initialized from here, overwrite attempt
  }
};

int main(int argc, char** argv) {
  B ey;
  cout<<ey.x<<endl;
  return 0;
}

我尝试在具体类的构造函数初始化上覆盖它:

B():Base(10),A(12){ 

输出仍然打印10。

由于A类不是我的具体类,它是否跳过了base的构造函数?

A(int x):Base(x){

2 个答案:

答案 0 :(得分:1)

虚拟基础仅由派生程度最高的类的构造函数构成,在本例中为B。 (它们也恰好是在构造最派生类的任何非虚拟直接基础之前构造的。)

因为在你的情况下A不是派生类最多的类,所以它的构造函数不构造虚拟基础。

答案 1 :(得分:0)

这种情况会发生,因为Base类构造函数只会被调用一次。它不会被多次调用。首先,为对象分配内存,然后调用Base的构造函数,然后调用A的构造函数,最后调用B的构造函数。基本上,在为对象分配内存之后,遍历从根类开始的继承树,并执行特定于每个派生部分的构造。层次结构中每个类的构造函数只调用一次。因此,只有当我们在A的构造函数中再次修改x的值时,才会在对象中更改x的值。