解读C++编程中派生类的构成和创建


C++派生类的构成
派生类中的成员包括从基类继承过来的成员和自己增加的成员两大部分。从基类继承的成员体现了派生类从基类继承而获得的共性,而新增加的成员体现了派生类的个性。正是这些新增加的成员体现了派生类与基类的不同,体现了不同派生类之间的区别。

在基类中包括数据成员和成员函数 (或称数据与方法)两部分,派生类分为两大部分:一部分是从基类继承来的成员,另一部分是在声明派生类时增加的部分。每一部分均分别包括数据成员和成员函数。

实际上,并不是把基类的成员和派生类自己增加的成员简单地加在一起就成为派生类。构造一个派生类包括以下3部分工作。

1) 从基类接收成员

派生类把基类全部的成员(不包括构造函数和析构函数)接收过来,也就是说是没有选择的,不能选择接收其中一部分成员,而舍弃另一部分成员。 从定义派生类的一般形式中可以看出是不可选择的。

这样就可能出现一种情况:有些基类的成员,在派生类中是用不到的,但是也必须继承过来。这就会造成数据的冗余,尤其是在多次派生之后,会在许多派生类对象中存在大量无用的数据,不仅浪费了大量的空间,而且在对象的建立、赋值、复制和参数的传递中, 花费了许多无谓的时间,从而降低了效率。这在目前的C++标准中是无法解决的,要求我们根据派生类的需要慎重选择基类,使冗余量最小。不要随意地从已有的类中找一个作为基类去构造派生类,应当考虑怎样能使派生类有更合理的结构。事实上,有些类是专门作为基类而设计的,在设计时充分考虑到派生类的要求。

2) 调整从基类接收的成员

接收基类成员是程序人员不能选择的,但是程序人员可以对这些成员作某些调整。例如可以改变基类成员在派生类中的访问属性,这是通过指定继承方式来实现的。如可以通过继承把基类的公用成员指定为在派生类中的访问属性为私有(派生类外不能访问)。此外,可以在派生类中声明一个与基类成员同名的成员,则派生类中的新成员会覆盖基类的同名成员。但应注意,如果是成员函数,不仅应使函数名相同,而且函数的参数表(参数的个数和类型)也应相同,如果不相同,就成为函数的重载而不是覆盖了。用这样的方法可以用新成员取代基类的成员。

3) 在声明派生类时增加的成员

这部分内容是很重要的,它体现了派生类对基类功能的扩展。要根据需要仔细考虑应当增加哪些成员,精心设计。例如在前面例子中(请查看:C++派生类的声明方式),基类的display函数的作用是输出学号、姓名和性别,在派生类中要求输出学号、姓名、性别、年龄和地址,不必单独另写一个输出这5个数据的函数,而要利用基类的display 函数输出学号、姓名和性别,另外再定义一个display_1 函数输出年龄和地址,先后执行这两个函数。也可以在 display_1 函数中调用基类的display函数,再输出另外两个数据,在主函数中只需调用一个display_1函数即可,这样可能更清晰一些,易读性更好。

此外,在声明派生类时,一般还应当自己定义派生类的构造函数和析构函数,因为构造函数和析构函数是不能从基类继承的。

通过以上的介绍可以看出:派生类是基类定义的延续。可以先声明一个基类,在此基类中只提供某些最基本的功能,而另外有些功能并未实现,然后在声明派生类时加入某些具体的功能,形成适用于某一特定应用的派生类。通过对基类声明的延续,将一个抽象的基类转化成具体的派生类。因此,派生类是抽象基类的具体实现。

C++派生类的声明方式(定义方式)
先通过一个例子来说明怎样通过继承来创建派生类,先从最简单的单继承开始。

class Student1: public Student //声明基类是Student
{
public:
  void display_1( ) //新增加的成员函数
  {
   cout<<"age: "<<age<<endl;
   cout<<"address: "<<addr<<endl;
  }
private:
  int age; //新增加的数据成员
  string addr; //新增加的数据成员
};

假设已经声明了一个基类Student(基类Student的定义见上节:C++继承与派生的概念),在此基础上通过单继承建立一个派生类Student1:
仔细观察第一行:

  class Student1: public Student


在class后面的Student1是新建的类名,冒号后面的Student表示是已声明的基类。在Student之前有一关键宇public,用来表示基类Student中的成员在派生类Studeml中的继承方式。基类名前面有public的称为“公用继承(public inheritance)”。

请大家仔细阅读以上声明的派生类Student1和基类Student,并将它们放在一起进行分析。

声明派生类的一般形式为:
   

 class 派生类名:[继承方式] 基类名
  {
    派生类新增加的成员
  };

继承方式包括public (公用的)、private (私有的)和protected(受保护的),此项是可选的,如果不写此项,则默认为private(私有的)。



相关阅读:
jQuery实现手机号码输入提示功能实例
CentOS yum php mcrypt 扩展安装方法
使用js在页面中绘制表格核心代码
asp.net实现图片以二进制流输出的两种方法
WinXP因配额不足导致无法访问如何解决
MySQL索引之主键索引
jquery trigger实现联动的方法
非常实用的php验证码类
Dojo获取下拉框的文本和值实例代码
安装专业版的linux的方法 图解安装专业版的linux
SQL数据库实例名称找不到或远程连接失败并显示错误error40的原因及解决办法
Oracle数据库中的级联查询、级联删除、级联更新操作教程
MAC 快捷键二则(附终端光标的快捷键)
js实现日期级联效果
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 大学生迟到检讨书500字 钱钟书经典语录,说大话哄人惯了,连自己也哄相信 你的记忆里消失了我 可爱的多丽丝娃娃 《寻梦瘦西湖》听后感 我打了一个很长的瞌睡 世间的美丽,常常要远远地欣赏 听 卡农钢琴曲有感 深夏的风热与雨情 形容心情好的句子 许四多经典语录 醉人的三峡风光作文650字 谢谢您,亲爱的妈妈11200字 水浒传读后感1000字(二) 小学五年级作文450字:冰棒不见了 紫色梦仙女 1 渐变红尘作文300字 2016咖啡厅三八妇女节活动方案策划 捕食第一天 尘封;记忆。何时开始麻木的忘了 对十六届四中全会精神的几点体会认识 如果 我们相爱了 我的世界开始下雪 长亭外,余欢伴凄凉 敬爱的父母 在我们成长过程中的母爱 鬼故事之【骷髅人,诡秘女友,砍死了蟒蛇精之后】 十元钱能做什么500字 初中初一作文500字:开心果狒狒猪 你若懂我,该多好 我的乐土 观蜗居有感 一次有趣的口语交际课700字 规范房屋租赁合同简单范本 初中毕业生自我评价 发给12星座的新年祝福 2015年安徽省高考作文 为什么能这样 XX年银行客户经理个人工作总结 写给自己--十八岁的天空。祭祀过往 三国演义手抄报图片 小摊边上的日子作文1000字 生命没有输赢只有值不值哲理经典语录(爱情语录) 秋天游植物园的作文 苍白了的岁月 2013年公司经理新年贺词 初二有关植树节的800字作文:去植树 高中高三作文1000字:过年的习俗 看图写话香蕉150字 300字有关腊八作文:腊八粥 李白《闻王昌龄左迁龙标,遥有此寄》

Copyright © 2016 phpStudy |