77范文网 - 专业文章范例文档资料分享平台

第5章 继承与派生(4)

来源:网络收集 时间:2018-11-21 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

运行结果 A:9->B:15->C

从结果可以知道,类成员的构造顺序是按声明的顺序。

下面我们来阅读一个程序,看我们掌握子对象的情况。 //自编,阅读程序,给出结果 #include using namespace std; class Counter { int val; public: Counter() //无参构造函数 { val=0;cout<<\的缺省构造函数\ } Counter(int x) //有参构造函数 { val=x;cout<<\的构造函数:\ } };

class Example { Counter c1,c2,c3; //子对象声明的顺序是c1、c2、c3 int val; public: Example() { val=0;cout<<\的缺省构造函数\ } Example(int x):c2(x) { val=x;cout<<\的构造函数:\ } };

int main() { Example e1; return 0; }

Counter的缺省构造函数 Counter的缺省构造函数 Counter的缺省构造函数 Example的缺省构造函数

由结果可以看出,建立一个类的对象时,要调用它的构造函数。如果这个类有子对象,要首先执行所有的子对象的构造函数,当全部子对象的初始化都完成之后,再执行当前类的构造函数体。

如果主函数的语句改为:Example e1(4);结果会怎么样呢? Counter的缺省构造函数 Counter的构造函数:4 Counter的缺省构造函数 Example的构造函数:4 修改以上程序如下: #include using namespace std; class Counter { int val; public: Counter() { val=0;cout<<\的缺省构造函数\ } Counter(int x) { val=x;cout<<\的构造函数:\ } };

class Example { Counter c1,c2,c3; int val; public: Example() { val=0;cout<<\的缺省构造函数\ } Example(int x1,int x2):c2(x1),c1(x2) { cout<<\的构造函数\ } void Print() { cout<<\ } };

int main() {

Example e1(2,4); return 0; }

运行结果如下:

Counter的构造函数:4 Counter的构造函数:2 Counter的缺省构造函数 Example的构造函数

从结果可以看出,当类中有多个子对象时,成员对象构造函数的执行顺序与子对象在类中声明的顺序有关,而与成员初始化列表中给出的子对象顺序无关。

//例5.6 包含子对象的派生类的构造函数。 //为了简化程序以易于阅读,这里设基类Student的数据成员只有两个,即num和name。 #include #include using namespace std; class Student//声明基类 {

public:

Student(int n, string nam ) //基类构造函数 { num=n; name=nam; }

void display( ) //成员函数,输出基类数据成员 {cout<<\protected:

int num; string name; };

class Student1: public Student //声明公用派生类Student1 {

private: //派生类的私有数据 Student monitor; //定义子对象(班长) int age; string addr; public:

Student1(int n, string nam,int n1, string nam1,int a, string ad)

:Student(n,nam),monitor(n1,nam1) //派生类构造函数 {age=a; addr=ad; }

void show( )

{cout<<\

display(); //输出num和name cout<<\ //输出age

cout<<\ //输出addr }

void show_monitor( ) //成员函数,输出子对象 {cout<

monitor.display( ); //调用基类成员函数 } };

int main( ) {

Student1 stud1(10010,\ stud1.show( ); //输出学生的数据 stud1.show_monitor(); //输出子对象的数据 return 0; }

从上例可以看出,定义一个含有子对象的派生类的一般形式为:

派生类构造函数(总参数表列):基类构造函数名(参数表列),子对象名(参数表列) {派生类中新增加数据成员初始化语句} 派生类构造函数的任务包括3个部分: (1)对基类数据成员初始化 (2)对子对象数据成员初始化 (3)对派生类数据成员初始化 执行派生类构造函数的顺序是: (1)调用基类构造函数 (2)调用子对象构造函数 (3)调用派生类构造函数本身 5.5.3 多层派生时的构造函数

如果派生是多级的,情况会怎样呢?如果基类还有基类,则基类会先调用基类的基类的构造函数,以此上溯。下面来看一个实例。

//===================================== // 自编

//===================================== #include #include using namespace std;

//------------------------------------- class A{ protected: int x; public:

A(){cout<<\为了看到结果,重载定义了无参构造函数,没有用默认的构造函数 };

class B:public A{ protected: int x;

public: B(){cout<<\};

class C:public B{ protected: int x; public: C(){cout<<\};

void main() { C c; }

运行结果为: A B C

如果在上例中,有如下定义:A(int a){cout<<\构造函数有参数,又没有重载定义无参构造函数,定义B b时就会出错,当然定义C c也会出错。那就需要我们自已来定义构造函数了。

派生类构造函数必须负责调用基类构造函数,并对其所要的参数进行设置。每个派生类只需负责它的直接基类的构造,以此上溯。

//===================================== // 自编

//===================================== #include #include using namespace std;

//------------------------------------- class A{ protected: int x; public: A(int a){cout<<\有参的构造函数,它的直接派生类要负责调用它 };

class B:public A{ protected: int x; public: B(int a):A(a){cout<<\ //负责直接基类A的构造 };

class C:public B{ protected: int x;

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库第5章 继承与派生(4)在线全文阅读。

第5章 继承与派生(4).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/293444.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: