new D(1,2,3);
执行D的构造函数,由于他是以初始化表的形式出现的,同时D继承自C:
D(int i,int j,int k):a(i),b(j),C(k){cout<<"D ";}
依次进行初始化
C(k) ------> 调用类 C的构造函数C(int k){cout<<"C ";} ----->输出字符 C
a(i) ------->a是A类的对象引用,调用类 A 的构造函数A(int i){cout<<"A ";} ------>输出字符 A
b(j) ------->b是B类的对象引用,调用类 B的构造函数B(int j){cout<<"B ";} ------->输出字符B
cout<<"D ";------------------------------------------------------->输出字符D
delete pc;------>注意pc的声明 :C *pc,他是指向C类对象的指针,delete应该调C类的析构函数
所以最后输出: ~C
合在一起就是:C A B D ~C
正确顺序: C A B D ~C
1、先构造父类,D是C的子类,故先构造C,输出C
2、然后根据参数构造A和B,这两个的构造顺序,是根据在D中a和b定义的顺序定的。先定义a,故先构造A。
3、最后构造D
4、释放空间,所以析构C