12、多继承的构造和析构函数调用顺序

转载:https://www.cnblogs.com/tenjl-exv/p/7624284.html

  • 声明多继承的方法

多继承与单继承的区别仅在于它们基类的个数。在定义多继承的派生类时,要指出它们所有基类名以及继承方式。

声明形式如下:

class 派生类名:继承方式1 基类名1,继承方式2,基类名2,......,继承方式n,基类名n

  派生类新增成员;

};

注意:每一个“继承方式”只限定紧随其后的基类。

  • 多继承派生类的构造函数

多继承下派生类的构造函数与单继承下派生类构造函数相似,其格式为:

派生类名 (总参数表):基类名1(参数表),......,基类名n(参数表),

     子对象1(参数表),......,子对象名n(参数表)

  派生类中新增数据结构成员初始化语句;

};

其中,(总参数表)中包含了其后的各个分参数表。

派生类构造函数执行的一般次序如下:

①调用基类构造函数,调用顺序按照它们被继承时说明的顺序(上文中声明多继承基类时的顺序,绿色部分)(从左到右)。

②调用子对象的构造函数,调用顺序按照它们在类中说明的顺序(多继承时声明子对象时的顺序)(从上到下)。

③执行派生类构造函数体中的内容。

注意:这些构造函数的执行顺序和派生类构造函数中列出的名称顺序毫无关系(即和上文中红色部分毫无关系)。

  • 多继承派生类的析构函数

与单继承的析构函数相似,派生类是否需要析构函数仅与其自身的需要有关,与基类的析构函数无关。析构函数的调用顺序与上面介绍的构造函数的调用顺序相反。

下面是一个多继承派生类的构造函数和析构函数的例子:

#include<iostream>
using namespace std;

class Base1
{
    public:
        Base1(int x)
            {cout<<"基类1构造函数"<<"X1= "<<x<<endl;}
        ~Base1()
            {cout<<"基类1析构函数"<<endl; }
};
class Base2
{
    public:
        Base2(int x)
            {cout<<"基类2构造函数"<<"X2= "<<x<<endl;}
        ~Base2()
            {cout<<"基类2析构函数"<<endl; }
};
class Base3
{
    public:
        Base3()
            {cout<<"基类3构造函数"<<endl;}
        ~Base3()
            {cout<<"基类3析构函数"<<endl; }
};

class A:public Base2,public Base3,public Base1
{
    public:
        A(int a,int b,int c,int d)
            :Base1(a),Base2(b),m1(c),m3(),m2(d)
            //此处如果基类构造函数没有参数,则可省略
            //基类和子函数的陈列,且顺序随意 
            //or:Base1(a),Base2(b),m1(c),m2(d)
        {
            cout<<"派生类构造函数"<<endl;
        }
        ~A()
        {
            cout<<"派生类析构函数"<<endl;
        }
    private:
    Base1 m1;
    Base2 m2;
    Base3 m3; 
};

int main()
{
    A obj(1,2,3,4);
    return 0;
}

实现效果如下:

猜你喜欢

转载自blog.csdn.net/llffss/article/details/97644244
今日推荐