问题一:父类和子类的构造和析构顺序?
在多继承中,创建子类对象,先调用父类的构造函数,调用父类的构造函数时候,按照父类被继承的顺序调用,再调用子类的构造函数,析构顺序与构造调用相反:先析构子类,再析构父类。
#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;
}
结论
问题二:在子类中创建父类对象,构造与析构的顺序又是怎么呢?
- 先调用父类的构造函数,调用顺序按照继承顺序
- 再调用子对象的构造函数,调用顺序按照它们在类中的说明顺序
- 再执行子类的构造函数的内容
- 析构顺序构造相反
#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;
}