C++中类的继承访问特性
来源:互联网 发布:淘宝找优惠券怎么赚钱 编辑:程序博客网 时间:2024/06/05 05:50
原文:http://blog.csdn.net/shandiantianying/article/details/9446407
一个私有的或保护的派生类不是子类,因为非公共的派生类不能做基类能做的所有的事,就是指在公开场合,但是在类内部可以的
一、引言
在C++中,类是提供封装的逻辑单位,类的每一个对象都包含有描述其自身状态的数据集合,并且通过接收特定的消息来处理这个数据集合。如果程序设计人员能够通过增加、修改或替换指定类的部分内容的方法对该类进行剪裁,就可以适应不同的应用,从而在很大程度上增强了数据封装的价值,而接下来要讨论的继承就完全可以实现这种操作。
二、与继承有关的基本概念
继承是一个进程,通过继承,一个对象可以获得另一个对象的属性(包括函数),并可向其中加入属于自己的一些特征。作为C++语言的一种重要机制,用继承的方法可以自动为一个类提供来自另一个类的操作和数据结构,进而使程序设计人员在一个一般的类的基础上很快建立一个新的类,而不必从零开始设计每个类。
当一个类被其他的类继承时,被继承的类称为基类(可不是鸡肋^_^),又称为父类。
继承其他类属性的类称为派生类,又称为子类。
一般情况下,继承的进程起源于一个基类的定义,基类定义了其所有派生类的公有属性。从本质上讲,基类具有同一类集合中的公共属性,派生类继承了这些属性,并且增加了自己特有的属性。从任何已存在的类继承的实质就是建造新的派生类。
三、单重继承、多重继承与继承链
从一个基类派生的继承称为单继承,换句话说,派生类只有一个直接基类。单继承声明语句的常用格式为:
class 派生类名: 访问控制关键字 基类名{
数据成员和成员函数声明
};
与此相对地,从多个基类派生的继承称为多继承或多重继承,也就是说,一个派生类有多个直接基类。在某些面向对象的语言(如Java)中不支持类间的多重继承而只支持单重继承,即一个类至多只能有一个直接父类,因此实现类似的功能需要借助接口等其他机制。而在C++中提供了多重继承的语法支持,使得问题变得简单了许多。多重继承声明语句的常用格式为:
class 派生类名: 访问控制关键字 基类名1, 访问控制关键字 基类名2,...{
数据成员和成员函数声明
};
除了多重继承之外,一个派生类继承多个基类还有一种方法,就是把派生类作为基类再次供别的类继承,产生多层次的继承关系。例如类A派生类B,类B派生类C,则称类A是类B的直接基类,类B是类C的直接基类,类A是类C的间接基类。类的层次结构也叫做继承链。还是上面的例子,当建立类C的对象时,类A的构造函数最先被调用,接下来被调用的是类B的构造函数,最后是类C的构造函数。析构函数的调用顺序正好相反。当一个派生类继承有层次的类时,继承链上的每个派生类必须将它需要的变量传递给它的基类。
四、公有派生和私有派生
在继承声明语句中,访问控制关键字用于说明在基类定义中所声明的成员和成员函数能够在多大范围内被派生类所访问。访问控制关键字可为public, private或protected。如果访问控制关键字为public,则称派生类从基类公有继承,也称公有派生。如果访问控制关键字为private,则称派生类从基类私有继承,也称私有派生。现在笔者将公有继承和私有继承的具体区别列表如下。
通过上表,我们可以将两种派生的特点总结如下:
基类成员基类private成员基类public成员派生方式privatepublicprivatepublic派生类成员不可见不可见可见可见外部函数不可见不可见不可见可见(1)无论哪种派生方式,基类中的private成员在派生类中都是不可见的。也就是说,基类中的private成员不允许外部函数或派生类中的任何成员访问。
(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成员变为protected成员不可见 public派生仍为public成员仍为protected成员不可见基类中的非私有成员在派生类中的访问属性保持不变需要注意的是,基类的private成员无论经过何种派生,在派生类中都是不可见的。
- C++中类的继承访问特性
- 类的继承访问特性
- 类的继承以及类中成员的访问特性
- 类的继承及其中成员的访问特性
- c++类的继承访问特性
- 类中公有继承的访问权限
- C#中类的继承
- 【c/c++】继承的访问控制
- C++ 公有继承、保护继承和私有继承中类成员的访问权限的控制
- C++ 公有继承、保护继承和私有继承中类成员的访问权限的控制
- C++ 公有继承、保护继承和私有继承中类成员的访问权限的控制
- C++ 公有继承、保护继承和私有继承中类成员的访问权限的控制
- C++类的继承特性
- java之中的四种访问权限和子类如何继承父类特性
- Spring Cloud中Feign的继承特性
- 【C++】通过基类的指针变量访问派生类中由基类继承来的隐藏对象
- 【Objective-C】OC中类的继承
- object-c中类的继承
- 浏览器代理无故被篡改 导致无法访问本地tomcat项目
- java数组
- 实际工作用到的:同店换房时计算老房间费用
- codevs 1201 最小数和最大数
- 【OAuth2.0网页授权】根据access_token和openId获取用户基本信息(Senparc.Weixin.MP.dll)
- C++中类的继承访问特性
- ORB特征提取与匹配
- Easypusher接口推送RTP数据
- 剑指offer 面试题8 旋转数组的最小值 java版答案
- Android解决多个Fragment切换时布局重新实例化问题
- 多文件组织词法分析
- 初学者该如何选择编程语言呢?
- 【Android Studio安装配置教程】二、配置
- 线段树初步