派生类构造函数顺序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012266559/article/details/65632429

写在最前面:

  • 派生类的构造函数执行顺序是(从左向右顺序):
    1. 虚基类构造函数
    2. 普通基类构造函数
    3. 子类构造函数
    4. 其他
  • 派生类析构函数顺序,与构造函数相反顺序

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

这里写图片描述

猜你喜欢

转载自blog.csdn.net/u012266559/article/details/65632429