C++多继承方式构造函数的执行顺序

来源:百度知道 编辑:UC知道 时间:2024/09/23 10:09:50
#include<iostream.h>
class Base1
{
private:
int a;
public:
Base1(int x)
{
a=x;
cout<<"Base1 Constructor !"<<endl;
}
int geta() {return a;}
};
class Base2
{
private:
int b;
public:
Base2(int x)
{
b=x;
cout<<"Base2 Constructor !"<<endl;
}
int getb() {return b;}
};
class Derived : public Base1,public Base2
{
private:
int c;
public:
Derived(int x,int y, int z) : Base2(z),Base1(y)
{
c=x;
cout<<"Derived Constructor!"<<endl;
}
void show()
{
cout<<geta()<<' '<<getb()<<' '<<c<<endl;
}
};
void main()
{
Derived obj (1,2,3);
obj.show ();
}

程序的输出结果

Base1 Constructor !
Base2 Constructor !
Derived C

明一个子类的对象时,首先调用父类的构造函数,如果一个子类有多个父类时,则按照声明的顺序一次执行父类的构造函数,如class Derived : public Base1,public Base2 你先声明Base1,后Base2,所以先调用Base1后Base2的构造函数,而与 Base2(z),Base1(y)的顺序无关。
本人现在缺分,给我加分吧!

在C++多继承中,构造函数的执行顺序,可以这样考虑:为了执行Derived的构造函数,必须先知道它所继承的类,因为直接执行Derived,那么Derived将不知道base1和base2是什么。
所以总起来说构造函数的执行顺序是按它在Derived中声明明顺序先后来执行的。
相反,虚构函数则是相反,要想析构Base1则必须先析构Derived的析构函数,这样对于base1才知道声明了什么。
建议你看一下《
C++程序设计精华》
名字大概是这样吧!你可以去图书馆借一下?
那里面讲的很详细.

说明两点
第一,编译系统是根据相同的参数名(而不是根据参数出现的顺序)来确定他们的传递顺序。
第二,多重继承时,调用基类函数是按照申明派生类时基类出现的顺序。也就是和这句对应:class Derived : public Base1,public Base2

1.基类的构造函数.
2.子对象的构造函数.
3.成员初始化表中的其他项.
4.派生类构造函数的函数体.