派生类构造函数举例(多继承、含有内嵌对象)
2013-04-07 10:01
816 查看
#include <iostream> using namespace std; class B1 { public: B1(int i){cout<<"coustructing B1 "<<i<<endl;} }; class B2 { public: B2(int j){cout<<"coustructing B2 "<<j<<endl;} }; class B3 { public: B3(){cout<<"coustructing B3 *"<<endl;} }; class C:public B2,public B1,public B3 { public: C(int a,int b, int c, int d):B1(a),memberB2(d),memberB1(c),B2(b){} private: B1 memberB1; B2 memberB2; B3 memberB3; }; int main() { C obj(1,2,3,4); return 0; }
这是一个具有一般性特征的例子,有三个基类B1,B2和B3,其中B3只有一个默认的构造函数,其余两个基类的成员只是一个带有参数的构造函数。类C由这三个基类经过公有派生而来。派生类新增加了三个私有对象成员,分别是B1、B2和B3类的对象。
分析:
因为基类及内嵌对象成员都具有非默认形式的构造函数,所以派生类中需要声明一个非默认形式(即带参数)的构造函数。这个派生类构造函数的主要功能就是初始化基类及内嵌对象成员,派生类的构造函数定义为:
C(int a,int b, int c, int d):B1(a),memberB2(d),memberB1(c),B2(b){}
构造函数的参数表中给出了基类及内嵌成员对象所需的全部参数,在冒号之后,分别列出了各个基类及内嵌对象名和各自的参数。
这里有几个问题要注意:
首先,这里并没有列出全部基类和成员对象,由于B3类只有默认构造函数,不需要给它传递参数,因此基类B3以及B3类成员对象memberB3就不必列出。
其次,基类名和成员对象名的顺序是随意的。
这个派生类构造函数的函数体为空,可见实际上只是起到了传递参数和调用基类及内嵌对象构造函数的作用。
程序的主函数只是声明了一个派生类C的对象obj,生成对象obj时调用了派生类的构造函数。我们来考虑C类构造函数的执行情况,它应该是先调用基类的构造函数,然后调用内嵌对象的构造函数。基类构造函数的调用顺序是按照派生类定义时的顺序,因此应该是先B2,再B1,再B3,而内嵌对象的构造函数调用顺序应该是按照成员在类中声明的顺序,应该是先B1,再B2,再B3,程序运行的结果也完全证实了这种分析。
程序的运行结果为:
![](http://img.my.csdn.net/uploads/201304/07/1365301747_4822.png)
相关文章推荐
- [C++]派生类构造函数举例(多继承、含有内嵌对象)
- 派生类构造函数举例(多继承、含有内嵌对象)
- 派生类析构函数举例(多继承、含有嵌入对象)
- 派生类析构函数举例(多继承、含有嵌入对象)
- 例4.8 含有对象成员的派生类构造函数和析构函数的执行顺序
- 【c++继承】继承关系中派生类对象构造函数和析构函数调用顺序
- 多继承且有内嵌对象时构造函数的调用顺序
- 例4.9 含有多个对象成员的派生类构造函数的执行顺序
- 多重继承和有内嵌对象时构造函数调用顺序
- 【C++继承与派生之二】有子对象的派生类的构造函数
- 【C++继承与派生之二】有子对象的派生类的构造函数
- 派生类对象模型之单继承派生类对象模型
- C++-继承:基类与派生类对象的关系&&继承与组合
- 算法-javascript自实现继承extend(单次继承原型对象和单次继承构造函数)
- 从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换
- c++继承详解之一——继承的三种方式、派生类的对象模型
- 派生类的构造函数、对象的初始化
- 从零开始学C++之继承(二):继承与构造函数、派生类到基类的转换
- 鸡啄米:C++编程入门系列之三十九(继承与派生:派生类的构造函数)
- 二十七、继承(四) 多重继承、虚继承与虚基类、虚基类及其派生类构造函数