C++程序之继承
2006-11-28 09:29
288 查看
一、引言
在C++中,类是提供封装的逻辑单位,类的每一个对象都包含有描述其自身状态的数据集合,并且通过接收特定的消息来处理这个数据集合。如果程序设计人员能够通过增加、修改或替换指定类的部分内容的方法对该类进行剪裁,就可以适应不同的应用,从而在很大程度上增强了数据封装的价值,而接下来要讨论的继承就完全可以实现这种操作。二、与继承有关的基本概念
继承是一个进程,通过继承,一个对象可以获得另一个对象的属性(包括函数),并可向其中加入属于自己的一些特征。作为C++语言的一种重要机制,用继承的方法可以自动为一个类提供来自另一个类的操作和数据结构,进而使程序设计人员在一个一般的类的基础上很快建立一个新的类,而不必从零开始设计每个类。当一个类被其他的类继承时,被继承的类称为基类(可不是鸡肋^_^),又称为父类。
继承其他类属性的类称为派生类,又称为子类。
一般情况下,继承的进程起源于一个基类的定义,基类定义了其所有派生类的公有属性。从本质上讲,基类具有同一类集合中的公共属性,派生类继承了这些属性,并且增加了自己特有的属性。从任何已存在的类继承的实质就是建造新的派生类。
三、单重继承、多重继承与继承链
从一个基类派生的继承称为单继承,换句话说,派生类只有一个直接基类。单继承声明语句的常用格式为:class 派生类名: 访问控制关键字 基类名 { 数据成员和成员函数声明 }; |
class 派生类名: 访问控制关键字 基类名1, 访问控制关键字 基类名2,... { 数据成员和成员函数声明 }; |
四、公有派生和私有派生
在继承声明语句中,访问控制关键字用于说明在基类定义中所声明的成员和成员函数能够在多大范围内被派生类所访问。访问控制关键字可为public, private或protected。如果访问控制关键字为public,则称派生类从基类公有继承,也称公有派生。如果访问控制关键字为private,则称派生类从基类私有继承,也称私有派生。现在笔者将公有继承和私有继承的具体区别列表如下。通过上表,我们可以将两种派生的特点总结如下:
基类成员 | 基类private成员 | 基类public成员 | ||
派生方式 | private | public | private | public |
派生类成员 | 不可见 | 不可见 | 可见 | 可见 |
外部函数 | 不可见 | 不可见 | 不可见 | 可见 |
(2)public派生与private派生的不同点在于基类中的public成员在派生类中的访问属性:
public派生时,基类中的public成员相当于派生类中的public成员。
private派生时, 基类中的public成员相当于派生类中的private成员。
因此,private派生确保基类中的方法只能被派生类的对象的方法间接使用,而不能被外部使用。public派生使派生类对象与外部都可以直接使用基类中的方法,除非这些方法已经被重新定义。
五、保护成员与保护派生
如果想做到基类成员只由有派生血缘关系的成员访问,而不被无血缘关系的对象成员访问,无论用公有派生还是私有派生都无法做到。因为基类成员中的私有成员是别的类(包括派生类)成员不能访问的,而基类中的公有成员在public派生时,不仅可以由派生类对象成员访问,也可以由外部函数访问;而在private派生时,基类中的公有成员虽然允许派生类对象中的成员访问,不允许外部访问,可是再派生出下一级时,由于基类的所有成员已经被私有化,其它类成员也不可再访问。实现只许有派生血缘关系的对象成员访问的方法,是在基类中使用具有另一种访问属性的成员——protected成员。protected成员是一种血缘关系内外有别的成员。它对派生对象而言,是公有成员,可以访问;对血缘关系外部而言,与私有成员一样被隐藏。
此外,除了允许使用private与public两种派生方式之外,C++还允许使用protected派生方式。现在将三种访问属性不同的成员经三种派生后在派生类中访问属性的变化情况总结如下表,是对上一表格的增进和补充。
派生方式 | 基类的public成员 | 基类的protected成员 | 基类的private成员 | 派生方式引起的访问属性变化概括 |
private派生 | 变为private成员 | 变为private成员 | 不可见 | 基类中的非私有成员都成为派生类中的私有成员 |
protected派生 | 变为protected成员 | 变为private成员 | 不可见 | 基类中的非私有成员在派生类中的访问属性都降一级 |
public派生 | 仍为public成员 | 仍为protected成员 | 不可见 | 基类中的非私有成员在派生类中的访问属性保持不变 |
六、友元类和友元函数
(1)友元函数通常,类的私有成员只能由本类的成员访问,外部函数只能访问类的成员函数,再由成员函数访问类的私有成员。但是,如果在某个类定义中用friend声明了一个外部函数(也许是其他类的一个成员)后,这个外部函数便可以例外地访问该类的任何私有成员。用friend声明了的外部函数称为这个类的友元函数。
当友元函数是另一个类的成员函数时,应当注意以下几点:
A:友元函数作为一个类的成员函数时,除应当在它所在的类定义中声明之外,还应当在另一个类中声明它的友元关系,声明语句的格式为:
friend 函数类型 函数所在类名::函数名(参数列表);
B:友元函数在引用本类对象的私有成员时无需本类对象的引用参数,但在引用生命它是友元的类的对象中的私有成员时必须有友元类对象的引用参数。
C:一个类的成员函数作另一个类的友元函数时,必须先定义,而不是仅仅声明它。
使用友元函数直接访问对象的私有成员,可以免去再调用类的成员函数所需的开销。同时,友元函数作为类的一个接口,对已经设计好的类,只要增加一条声明语句,便可以使用外部函数来补充它的功能,或架起不同类对象之间联系的桥梁。然而,它同时也破坏了对象封装与信息隐藏,使用时需要谨慎小心。
(2)友元类
也可以把一个类而不仅仅是一个函数声明为另一个类的友元类。这时,只需先声明它而不一定需要先定义。
应当注意,友元关系是单向的,并且只在两个类之间有效。即使类X是类Y的友元,类Y是否是类X的友元也要看类X中是否有相应的声明。即友元关系不具有交换性。若类X是类Y的友元,类Y是类Z的友元,也不一定就说明类X是类Z的友元,即友元关系也不具有传递性。
当一个类要和另一个类协同工作时,使一个类成为另一个类的友元类是很有用的。这时友元类中的每一个成员函数都成为了对方的友元函数。
七、总结
对比Java语言,C++在继承上显得十分丰富和充满变化,它在继承过程中对于访问权限的多种变化是其一大特点,同时对于多重继承的语法支持也使得复杂继承的实现更为简便。然而,完全弄清几种成员在几种继承下访问权限的变化及其应用的时机是需要大量练习的。祝大家都能在实践中逐步体会其中的奥妙。原帖:http://www.frontfree.net/view/article_618.html
为什么要转贴?--呵呵,因为我以后有篇文章要用到。
传闻中的begtostudy之编程技术文集
相关文章推荐
- C02-程序设计基础提高班(C++)第12周上机任务-类的继承
- 2015级C++第10、11周程序阅读 继承和派生
- 【c++程序】多重继承
- [MFC学习之C++基础] 孙鑫视频中第三讲中提到的小测试程序(关于基类和子类的继承关系)
- 【c++程序】多重继承
- c++之学习程序继承public(修改)
- [C/C++] 第17章 用于大型程序的工具 [ 异常处理,命名空间,多重继承与虚继承 ] (不够熟) 《 C++ Primer 》
- 2015级C++第10、11周程序阅读(补充) 继承和派生
- 走进C++程序世界------继承和派生
- 两个小程序看C++继承和组合的构造顺序
- 【c++程序】继承的构造与析构
- 【c++程序】继承的几个问题
- [C/C++] 第17章 用于大型程序的工具 [ 异常处理,命名空间,多重继承与虚继承 ] (不够熟) 《 C++ Primer 》
- 走进C++程序世界-----继承和派生(2)
- PKU C++程序设计实习 学习笔记2 继承与派生
- 走进C++程序世界-----私有继承
- c++之学习程序继承public
- C++程序示例:涉及到抽象类、继承…
- 【c++程序】多重继承容易产生两义性
- 走进C++程序世界-----继承和派生(2)