我有以下结构
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
我哪里出错?
由于
答案 0 :(得分:1)
默认情况下在结构中公开。
答案 1 :(得分:1)
它不打印100
,打印10
后跟0
。
结构意味着默认情况下字段是私有的还是公共字段?
公共
答案 2 :(得分:1)
由于继承,C对象“包含”B1对象和B2对象。 B1和B2对象都“包含”A对象,但由于您具有A的虚拟继承,因此每个C对象中只有一个A对象,而不是两个。使用A的默认构造函数初始化此单个A对象。