写在最前面:
- 派生类的构造函数执行顺序是(从左向右顺序):
- 虚基类构造函数
- 普通基类构造函数
- 子类构造函数
- 其他
- 派生类析构函数顺序,与构造函数相反顺序
其他:基类可以是虚基类(添加virtual 关键字),虚基类的作用是避免多重继承导致混乱。
例如:
基类:class A{
int member; //测试变量
}
一重继承:class B1: public father{
int val_1;
}
class B2: public father{
int val_2;
}
二重继承:class D: public B1, public B2{
int val;
}
如上类D继承了B1与B2,而二者都从基类A派生出来,都含有成员变量member,这时候就会存在下图(b)的情况,如果为虚继承则是(a)的情况。
测试代码:
// base.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "iostream"
using namespace std;
class base{
public:
base(){
m = 0;
b = 10;
cout<<"this is base"<<endl;
}
~base(){cout<<"this is ~base"<<endl;}
void fun(){
cout<<"m: "<<m<<", val "<<b<<endl;
cout<<"this is fun in base"<<endl;
}
virtual void vfun(){
cout<<"m: "<<m<<", val "<<b<<endl;
cout<<"this is vfun in base"<<endl;
}
protected:
int m;
int b;
};
class vbase{
public:
vbase(){
m = 1;
vb =11;
cout<<"this is vbase"<<endl;
}
~vbase(){cout<<"this is ~vbase"<<endl;}
void fun(){
cout<<"m: "<<m<<", val "<<vb<<endl;
cout<<"this is fun in vbase"<<endl;
}
virtual void vfun(){
cout<<"m: "<<m<<", val "<<vb<<endl;
cout<<"this is vfun in vbase"<<endl;
}
protected:
int m;
int vb;
};
class drive: public base,virtual public vbase{
public:
drive(){
m = 2;
d = 12;
cout<<"this is drive"<<endl;
}
~drive(){cout<<"this is ~drive"<<endl;}
void fun(){
cout<<"m: "<<m<<", val "<<d<<endl;
cout<<"this is fun in drive"<<endl;
}
virtual void vfun(){
cout<<"m: "<<m<<", val "<<d<<endl;
cout<<"this is vfun in drive"<<endl;
}
//friend void func(class drive);
protected:
int d;
int m;
};
int _tmain(int argc, _TCHAR* argv[])
{
cout<<"here is _tmain speaking"<<endl;
cout<<"-------------constructer-------------"<<endl;
drive *obj = new drive();
cout<<"\n-------------function & variabe-------------"<<endl<<endl;
cout<<"-------------drive-------------"<<endl;
obj->fun();
obj->vfun ();
//func(*obj);
cout<<"-------------base-------------"<<endl;
obj->base::fun ();
obj->base::vfun ();
cout<<"--------------vbase------------"<<endl;
obj->vbase::fun ();
obj->vbase::vfun ();
cout<<"\n-------------deconstructer-------------"<<endl;
delete obj;
return 0;
}
以上代码在VS中编译通过,结果如下:
结果一目了然。把virtual删掉后可以查看同等情况的集成顺序。