1.构造函数的顺序和析构函数的顺序完全相反。
2.析构函数可写成虚函数
virtual ~CBase1( ) { cout<<“XG ~CBase1()!”<<endl;}
3.构造函数不能
4.基类有纯虚函数,在构造子类时仍然要执行基类的构造函数
5.构造子类时,先调用基类的构造函数
6.调用基类的构造函数时,按照继承列表的顺序。
但是如果有virtual时(即虚继承),则最先虚继承。
#include<iostream>
using namespace std;
class CBase1{
int x ;
public:
CBase1( ) { x=0 ; cout<<"GZ CBase1()!"<<endl;}
CBase1(int a) { x=1;cout<<"GZ CBase1(int)!"<<endl;}
virtual ~CBase1( ) { cout<<"XG ~CBase1()!"<<endl;}
};
class CBase2{
int y;
public:
CBase2( ) { y=0 ;cout<<"GZ CBase2()!"<<endl;}
CBase2(int a) { y=a ;cout<<"GZ CBase2(int)!"<<endl;}
~CBase2() { cout<<"XG ~CBase2()!"<<endl;}
};
class A{
int x;
public:
A () {x=0; cout<<"GZ A()!"<<endl;}
A(int a) { x=a; cout<<"GZ A(int)!"<<endl;}
~A() { cout<<"XG ~A()!"<<endl;}
};
class CDerived:public CBase1, virtual public CBase2{
A a;
public:
CDerived() { cout<<"GZ CDerived()!"<<endl;}
CDerived(int x,int y ,int z):a(x),CBase1(y),CBase2(z)
{ cout<<"GZ CDerived(int,int)!"<<endl;}
~CDerived() { cout<<"XG ~CDerived()!"<<endl;}
};
int main(){
CBase1 *p=new CDerived;
cout<<"main() OVER!"<<endl;
delete p;
return 0;
}
GZ CBase2()!
GZ CBase1()!
GZ A()!
GZ CDerived()!
main() OVER!
XG ~CDerived()!
XG ~A()!
XG ~CBase1()!
XG ~CBase2()!