您的位置:首页 > 其它

派生类构造函数顺序

2017-03-24 16:00 465 查看

写在最前面:

派生类的构造函数执行顺序是(从左向右顺序):

虚基类构造函数

普通基类构造函数

子类构造函数

其他

派生类析构函数顺序,与构造函数相反顺序

其他:基类可以是虚基类(添加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删掉后可以查看同等情况的集成顺序。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: