写出下面程序的输出:
class A{
public:
char c1;
A(){c1='A';}
A(char c1){this->c1=c1;}
};
class B:public virtual A{
public:
char c2;
B(){c2='B';}
B(char c1,char c2):A(c1){this->c2=c2;}
};
class C:public virtual A{
public:
char c3;
C(){c3='C';}
C(char c1,char c3):A(c1){this->c3=c3;}
};
class D:public B,public C{
public:
char c4;
D(){c3='D';}
D(char c1,char c2,char c3,char c4):B(c1,c2),C(c3,c3){this->c4=c4;}
};
D obj('a','b','c','d');
cout<<obj.c1<<obj.c2<<obj.c3<<obj.c4<<endl;
- 虚继承保证继承关系中的虚基类只被初始化一次;
- 在菱形继承中,底层类的构造函数初始化列表中会首先调用顶层类的构造函数,如果底层类的初始化列表中没有显示调用顶层类的构造函数,编译器会自动调用顶层类的无参构造函数。因此类D的构造函数等价于:
- D(char c1,char c2,char c3,char c4):A(),B(c1,c2),C(c3,c3).
- 因此,程序输出为Abcd。