多继承构造与析构顺序

问题一:父类和子类的构造和析构顺序?

 在多继承中,创建子类对象,先调用父类的构造函数,调用父类的构造函数时候,按照父类被继承的顺序调用,再调用子类的构造函数,析构顺序与构造调用相反:先析构子类,再析构父类。

#include<iostream>
using namespace std;
class B1
{
    public:
        B1(int x)
            {cout<<"基类B1构造函数"<<"X1= "<<x<<endl;}
        ~B1()
            {cout<<"基类B1析构函数"<<endl; }
};
class B2
{
    public:
        B2(int x)
            {cout<<"基类B2构造函数"<<"X2= "<<x<<endl;}
        ~B2()
            {cout<<"基类B2析构函数"<<endl; }
};
class B3
{
    public:
        B3()
            {cout<<"基类B3构造函数"<<endl;}
        ~B3()
            {cout<<"基类B3析构函数"<<endl; }
};

class A:public B2,public B3,public B1
{
    public:
    //因为子类继承了父类所有的属性和方法,会默认调用父类的无参构。
    //如果父类写了有参构造,那么编译器不会给其提供无参构造。因此无法构造出父类对象
    //解决方法:1、给父类写一个无参构造  2、初始化列表 构造函数 : + 类名()
        A(int a, int b):B2(b),B1(a)
        {
            cout<<"派生类构造函数"<<endl;
        }
        ~A()
        {
            cout<<"派生类析构函数"<<endl;
        }
};

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

结论

问题二:在子类中创建父类对象,构造与析构的顺序又是怎么呢?

  1. 先调用父类的构造函数,调用顺序按照继承顺序
  2. 再调用子对象的构造函数,调用顺序按照它们在类中的说明顺序
  3. 再执行子类的构造函数的内容
  4. 析构顺序构造相反
#include<iostream>
using namespace std;
class B1
{
    public:
        B1(int x)
            {cout<<"基类B1构造函数"<<"X1= "<<x<<endl;}
        ~B1()
            {cout<<"基类B1析构函数"<<endl; }
};
class B2
{
    public:
        B2(int x)
            {cout<<"基类B2构造函数"<<"X2= "<<x<<endl;}
        ~B2()
            {cout<<"基类B2析构函数"<<endl; }
};
class B3
{
    public:
        B3()
            {cout<<"基类B3构造函数"<<endl;}
        ~B3()
            {cout<<"基类B3析构函数"<<endl; }
};

class A:public B2,public B3,public B1
{
    public:
        A(int a, int b, int c, int d):B2(b),B1(a),m1(c),m2(d)
        {
            cout<<"派生类构造函数"<<endl;
        }
        ~A()
        {
            cout<<"派生类析构函数"<<endl;
        }
private:
    //子类中的声明顺序
    B3 m3;
    B1 m1;
    B2 m2;

};

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值