为什么以下代码打印100?

时间:2012-02-19 12:42:08

标签: c++ virtual-inheritance

我有以下结构

struct A 
{
   int i;
   A() { i = 0; }
   A(int _i) : i(_i) {}
   virtual void f() { cout << i; }
};



struct B1 : virtual A {
   B1() : A(1) { f(); }
   void f() { cout << i+10; }
};


struct B2 : virtual A {
   B2(int i) : A(2) { f(); }
};


struct C : B1, B2 {
   C() : B2(3) {}
};

请解释为什么以下代码打印100:(10 + 0)

 C* c = new C();

我认为它应该打印1111: 首先是A():i = 0 然后B1():i = 1并打印B1::f() - 11 然后B2():打印B1::f() - 11

我哪里出错?

由于

3 个答案:

答案 0 :(得分:1)

默认情况下在结构中公开。

答案 1 :(得分:1)

它不打印100,打印10后跟0

  

结构意味着默认情况下字段是私有的还是公共字段?

公共

答案 2 :(得分:1)

由于继承,C对象“包含”B1对象和B2对象。 B1和B2对象都“包含”A对象,但由于您具有A的虚拟继承,因此每个C对象中只有一个A对象,而不是两个。使用A的默认构造函数初始化此单个A对象。