派生类构造函数顺序
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删掉后可以查看同等情况的集成顺序。
相关文章推荐
- 构造函数和析构函数在基类和派生类之间的调用顺序
- 例4.8 含有对象成员的派生类构造函数和析构函数的执行顺序
- 关于基类和派生类的构造函数和析构函数的执行顺序问题
- C++:派生类的构造函数和析构函数的调用顺序
- C++派生类对象构造函数初始化顺序
- 关于派生类构造函数与基类构造函数的调用顺序问题
- c++学习笔记4,派生类的构造函数与析构函数的调用顺序(一)
- 派生类构造函数和析构函数的执行顺序
- 例4.9 含有多个对象成员的派生类构造函数的执行顺序
- C++中基类,派生类 类成员对象的构造函数,析构函数的顺序
- C++之派生类的构造函数和析构函数调用顺序
- 派生类构造函数和析构函数的执行顺序
- 派生类构造函数的执行顺序
- 派生类构造函数的调用顺序
- C++派生类构造函数调用顺序(详解)
- 关于派生类构造函数与基类构造函数的调用顺序问题
- 构造函数访问权限和基类构造函数,派生类的构造函数调用顺序
- 基类和派生类构造函数函数执行顺序
- C++学习笔记(5)——基类、派生类的构造函数、析构函数的调用顺序
- 关于派生类构造函数与基类构造函数的调用顺序问题