以下输出什么?为什么是这个顺序?

来源:百度知道 编辑:UC知道 时间:2024/06/04 02:08:46
#include<iostream.h>
class Base1
{public:
Base1 (int i){cout<<"调用基类Base1的构造函数"<<i<<endl;}
};
class Base2
{public:
Base2 (int j){cout<<"调用基类Base2的构造函数"<<j<<endl;}
};
class A : public Base1,public Base2
{public:
A(int a, int b,int c ,intd):Base2(b),Base(c),b2(a),b1(d)
{cout<<"调用派生类A的构造函数"<<a+b+c+d<<endl;}
private:
Base1 b1;
Base2 b2;
};
void main()
{A obj(1,2,3,4);}
还是不明白~那章构造函数继承顺序我看过~但就是不明白这题~那些数字也不明白为什么就是3241~为什么不是先调用两个Base1再调用两个Base2?

/*
调用基类Base1的构造函数3
调用基类Base2的构造函数2
调用基类Base1的构造函数4
调用基类Base2的构造函数1
调用派生类A的构造函数10
*/
看看派生类的构造函数

初始化派生类自身成员的时候,构造函数的调用顺序是依赖它的声明顺序,而不是初始化列表的顺序
即是按
private:
Base1 b1;
Base2 b2;
这个顺序的,而不是按初始化列表A(int a, int b,int c ,intd):Base2(b),Base(c),b2(a),b1(d) 的顺序

解释一下:首先,你要明白,对于派生类的构造函数,首先是调用基类的构造函数,然后才调用它自身的构造函数.
那么,class A : public Base1,public Base2

由于Base1,Base2分别是A类的基类,由它们被继承的顺序,首先调用基类Base1的构造函数,然后调用Base2的构造函数,调用这两个构造函数的目的是用来初始化派生类对象中的基类子对象(即派生类中的基类部分)

然后初始化,派生类自身的成员,即
private:
Base1 b1;
Base2 b2;

初始化派生类自身的成员,是按它声明或者定义的顺序,而不是按它在初始化列表中的顺序,即是按类中定义的
Base1 b1;
Base2 b2;
这个顺序初始化的,而并不是按
A(int a, int b,int c ,intd):Base2(b),Base1(c),b2(a),b1(d) 中
先Base2(b)后Base1(c)的顺序

因此,首先调用Base1的构造函数,然后调用Base2的构造函数

最后,再调用派生类自身的构造函数,至于数字为什么3241,按这个分析一下就知道了