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

第5章 继承与派生(3)

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

void f3(); int k; };

class C:protected B{ int n; public:

void f4(); protected: int m; };

class D:private C{ int q; public:

void f5(); protected: int p; }; 成员 i 类 基类A 私有√ B公有继承 C保护继承 D私有继承 × f1 f2 B::m f3 k n f4 C::m q f5 p 公有√ 公有√ 保护√ 私有√ 保护√ 保护√ 保护√ 私有√ 私有√ × 公共√ 保护√ 私有√ 公共√ 保护√ 私有√ × 私有公共√ √ × 私有√ 保护√ 私有√ × × 私有公共√ √ 保护√

5.5 派生类的构造函数和析构函数

在第3章中讲过,用户如果没有定义构造函数,C++会自动提供给我们一个默认的构造函数。在定义类对象时会自动调用默认的构造函数。

基类的构造函数是不能继承的,所以在声明派生类时,不仅要考虑派生类所增加的数据成员的初始化,还要考虑基类的数据成员的初始化。 5.5.1 简单的派生类中的构造函数

简单的派生只有一个基类,而且只有一级派生,在派生类的数据成员中不包含子对象(子对象问题在下面马上讲解)。

先来看一个最简单的实例。

//自编,是简单的继承。隐含调用默认构造函数 #include using namespace std; class A {

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

class B:public A {

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

int main() { B b; }

运行结果: A

看到这个结果不要认为是派生类B继承了基类A的构造函数,其实只是隐含调用了基类的默认构造函数。思考:如果把注释删除,运行结果会是什么?

B(){cout<<”B”<

如果基类的构造函数是有参的,那么你在派生类中不定义构造函数程序就会出错。下面我们就来看一下书中的实例。

//例5.5 简单的派生类的构造函数。 #include #include using namespace std;

class Student //声明基类Student {

public:

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

name=nam; sex=s; }

~Student( ){ } //基类析构函数 protected: //保护部分 int num; string name;

char sex ; };

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

public: //派生类的公用部分

Student1(int n,string nam,char s,int a,string ad):Student(n,nam,s) { age=a; //在函数体中只对派生类新增的数据成员初始化 addr=ad; }

//也可写成如下形式:

//Student1(int n,string nam,char s,int a,string ad):Student(n,nam,s),age(a),addr(ad){} void show( ) {

cout<<\ cout<<\ cout<<\ cout<<\

cout<<\ }

~Student1( ){ } //派生类析构函数 private: //派生类的私有部分 int age; string addr; };

int main( )

{Student1 stud1(10010,\ Student1 stud2(10011,\ stud1.show( ); //输出第一个学生的数据 stud2.show( ); //输出第二个学生的数据 return 0; }

运行结果: num:10010 name:Wang-li sex:f age:19

address:115 Beijing Road,Shanghai num:10011

name:Zhang-fun sex:m age:21

address:213 Shanghai Road,Beijing 派生类构造函数的一般形式为:

派生类构造函数名(总参数表列):基类构造函数名(参数表列) {派生类中新增数据成员初始化语句}

总参数表列中包括基类构造函数所需的参数和对派生类中新增的数据成员初始化所需的参数。

在建立一个对象时,执行构造函数的顺序是:派生类构造函数先调用基类构造函数再执行派生类构造函数本身。

在派生类对象释放时,先执行派生类构构函数再执行基类析构函数。

思考:将上例基类构造函数中加入语句:cout<<”student”<

address:115 Beijing Road,Shanghai num:10011

name:Zhang-fun sex:m age:21

address:213 Shanghai Road,Beijing ~Student1 ~Student ~Student1 ~Student

5.5.2有子对象的派生类的构造函数

在前面介绍的类中数据成员都是标准数据类型,而实际上也可以是类对象。这种称为子对象。

//自编,有一个子对象 #include using namespace std;

//------------------------------------- class A {

public:

A(int x){ cout<<\};//----------------------------------- class C

{ A a; //有一个子对象 public: C(int i1,int i2):a(i1){ cout<<\ //构造函数,要构造子对象 };//----------------------------------- int main() {

C c(15,2); return 0;

}//====================================

运行结果如下:A:15->C:2,从结果可以看出,先执行子对象的构造函数。

思考:如果有一个派生类继承了类C(这个类有子对象),那么这个构造函数该要怎么定义呢?这个问题后面马上就有讲解。答案先写在下面。

class P:public C {

public: P(int i1,int i2,int i3):C(i1,i2){cout<<\};

下面再来看有多个子对象时的情况,书中没有介绍,但我们一定要了解。 // 自编,有二个子对象 #include using namespace std;

//------------------------------------- class A{ public:

A(int x){ cout<<\};//----------------------------------- class B{ public:

B(int x){ cout<<\};//-----------------------------------

class C{ //类C中的两个子对象 先声明a,再声明b A a; B b; public:

C(int x,int y):b(x),a(y){ cout<<\ //构造参数表的顺序是先b后a //如果构造顺序是先a后 b,其结果是一样的,与声明时的顺序有关。 };//----------------------------------- int main(){ C c(15, 9);

}//====================================

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

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