• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 深入分析C++派生类中的保护成员继承

深入分析C++派生类中的保护成员继承

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c++派生类,c++类的继承与派生,c++派生类构造函数,c++继承与派生,c++继承与派生实例等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

protected 与 public 和 private 一样是用来声明成员的访问权限的。由protected声明的成员称为“受保护的成员”,或简称“保护成员”。从类的用户角度来看,保护成员等价于私有成员。但有一点与私有成员不同,保护成员可以被派生类的成员函数引用。

如果基类声明了私有成员,那么任何派生类都是不能访问它们的,若希望在派生类中能访问它们,应当把它们声明为保护成员。如果在一个类中声明了保护成员,就意味着该类可能要用作基类,在它的派生类中会访问这些成员。

在定义一个派生类时将基类的继承方式指定为protected的,称为保护继承,用保护继承方式建立的派生类称为保护派生类(protected derived class ), 其基类称为受保护的基类(protected base class ),简称保护基类。

保护继承的特点是:保护基类的公用成员和保护成员在派生类中都成了保护成员,其私有成员仍为基类私有。也就是把基类原有的公用成员也保护起来,不让类外任意访问。

保护基类的所有成员在派生类中都被保护起来,类外不能访问,其公用成员和保护成 员可以被其派生类的成员函数访问。

保护基类的所有成员在派生类中都被保护起来,类外不能访问,其公用成员和保护成员可以被其派生类的成员函数访问。

比较一下私有继承和保护继承(也就是比较在私有派生类中和在保护派生类中的访问属性), 可以发现,在直接派生类中,以上两种继承方式的作用实际上是相同的:在类外不能访问任何成员,而在派生类中可以通过成员函数访问基类中的公用成员和保护成员。但是如果继续派生,在新的派生类中,两种继承方式的作用就不同了。

例如,如果以公用继承方式派生出一个新派生类,原来私有基类中的成员在新派生类中都成为不可访问的成员,无论在派生类内或外都不能访问,而原来保护基类中的公用成员和保护成员在新派生类中为保护成员,可以被新派生类的成员函数访问。

大家需要记住:基类的私有成员被派生类继承(不管是私有继承、公有继承还是保护继承)后变为不可访问的成员,派生类中的一切成员均无法访问它们。如果需要在派生类中引用基类的某些成员,应当将基类的这些成员声明为protected,而不要声明为private。

如果善于利用保护成员,可以在类的层次结构中找到数据共享与成员隐蔽之间的结合点。既可实现某些成员的隐蔽,又可方便地继承,能实现代码重用与扩充。

通过以上的介绍,可以知道以下几点。

1) 在派生类中,成员有4种不同的访问属性:
公用的,派生类内和派生类外都可以访问。
受保护的,派生类内可以访问,派生类外不能访问,其下一层的派生类可以访问。
私有的,派生类内可以访问,派生类外不能访问。
不可访问的,派生类内和派生类外都不能访问。

需要说明的是:
这里所列出的成员的访问属性是指在派生类中所获得的访问属性。
所谓在派生类外部,是指在建立派生类对象的模块中,在派生类范围之外。
如果本派生类继续派生,则在不同的继承方式下,成员所获得的访问属性是不同的,在本表中只列出在下一层公用派生类中的情况,如果是私有继承或保护继承,大家可以从表11.3中找到答案。

2) 类的成员在不同作用域中有不同的访问属性,对这一点要十分清楚。一个成员的访问属性是有前提的,要看它在哪一个作用域中。有的读者问:“一个基类的公用成 员,在派生类中变成保护的,究竟它本身是公用的还是保护的?”应当说:这是同一个成员在不同的作用域中所表现出的不同特征。例如,学校人事部门掌握了全校师生员工的资 料,学校的领导可以查阅任何人的材料,学校下属的系只能从全校的资料中得到本系师生员工的资料,而不能查阅其他部门任何人的材料。如果你要问:能否查阅张某某的材料, 无法一概而论,必须查明你的身份,才能决定该人的材料能否被你“访问”。

在未介绍派生类之前,类的成员只属于其所属的类,不涉及其他类,不会引起歧义。 在介绍派生类后,就存在一个问题:在哪个范围内讨论成员的特征,同一个成员在不同 的继承层次中有不同的特征。为了说明这个概念,可以打个比方,汽车驾驶证是按地区核发的,北京的驾驶证在北京市范围内畅通无阻,如果到了外地,可能会受到某些限制,到了外国就无效了。同一个驾驶员在不同地区的权利是不同的。又譬如,到医院探视病人,如 果允许你进人病房近距离地看望病人并与之交谈,则可对病人了解比较深人;如果只允许你在玻璃门窗外探视,在一定距离外看到病人,只能对病人状况有粗略的印象;如果只允许在病区的走廊里通过电视看病人活动的片段镜头,那就更间接了。人们在不同的场合下对同一个病人,得到不同的信息,或者说,这个病人在不同的场合下的“可见性”不同。

平常,人们常习惯说某类的公用成员如何如何,这在一般不致引起误解的情况下是可以的。但是决不要误认为该成员的访问属性只能是公用的而不能改变。在讨论成员的访问属性时,一定要说明是对什么范围而言的,如基类的成员a,在基类中的访问属性是公用的,在私有派生类中的访问属性是私有的。

下面通过一个例子说明怎样访问保护成员。

[例] 在派生类中引用保护成员。

#include <iostream>
#include <string>
using namespace std;
class Student//声明基类
{
public:
  //基类公用成员
  void display( );
protected:
  //基类保护成员
  int num;
  string name;
  char sex;
};
//定义基类成员函数
void Student::display( )
{
  cout<<"num: "<<num<<endl;
  cout<<"name: "<<name<<endl;
  cout<<"sex: "<<sex<<endl;
}
class Student1: protected
Student //用protected方式声明派生类Student1
{
public:
  void display1( );//派生类公用成员函数
private:
  int age;//派生类私有数据成员
  string addr;//派生类私有数据成员
};
void Student1::display1( )//定义派生类公用成员函数
{
  cout<<"num: "<<num<<endl;//引用基类的保护成员,合法
  cout<<"name: "<<name<<endl;//引用基类的保护成员,合法
  cout<<"sex: "<<sex<<endl;//引用基类的保护成员,合法
  cout<<"age: "<<age<<endl;//引用派生类的私有成员,合法
  cout<<"address: "<<addr<<endl; //引用派生类的私有成员,合法
}
int main( )
{
  Student1 stud1; //stud1是派生类Student1类的对象
  stud1.display1( ); //合法,display1是派生类中的公用成员函数
  stud1.num=10023; //错误,外界不能访问保护成员
  return 0;
}
</div>

在派生类的成员函数中引用基类的保护成员是合法的。基类的保护成员对派生类的外界来说是不可访问的(例如,num是基类Student中的保护成员,由于派生类是保护继承,因此它在派生类中仍然是受保护的,外界不能用stud1.num来引用它),但在派生类内,它相当于私有成员,可以通过派生类的成员函数访问。可以看到,保护成员和私有成员不同之处,在于把保护成员的访问范围扩展到派生类中。

注意:在程序中通过派生类Student1的对象stud1的公用成员函数display1去访问基类的保护成员num、name和sex,不要误认为可以通过派生类对象名去访问基类的保护 成员(如stud1.num是错误的)。

私有继承和保护继承方式在使用时需要十分小心,很容易搞错,一般不常用,本教程后面的例子主要介绍公用继承方式。

</div>
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C++派生访问说明符小记(推荐)
  • C++ 类中有虚函数(虚函数表)时 内存分布详解
  • 浅谈C++中派生类对象的内存布局
  • C++聚合关系类的构造函数的调用顺序详解
  • 解析C++中多层派生时的构造函数及一些特殊形式
  • 深入解析C++中派生类的构造函数
  • 深入分析C++派生类中的保护成员继承
  • 解析C++中派生的概念以及派生类成员的访问属性
  • 解读C++编程中派生类的构成和创建
  • c++制作的时间函数类

相关文章

  • 2017-05-28复数乘法中的结构体赋值实现代码
  • 2017-05-28ON_COMMAND_RANGE多个按钮响应一个函数的解决方法
  • 2017-05-28C++中将string类型转化为int类型
  • 2017-05-28基于linux下C开发中的几点技术经验总结
  • 2017-05-28C语言数据结构中串的模式匹配
  • 2017-05-28使用WindowsAPI获取录音音频的方法
  • 2017-05-28C++使struct对象拥有可变大小的数组(详解)
  • 2017-05-28解析如何在C语言中调用shell命令的实现方法
  • 2017-05-28c语言中malloc、realloc与calloc 的区别以及联系
  • 2017-05-28C语言实现大整数加减运算详解

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 总结IOS中nil、Nil、NULL和NSNull区别
    • C++ vector的用法小结
    • C++ 多重继承和虚拟继承对象模型、效率分析
    • c语言一级指针简单应用
    • c++函数中的指针参数与地址参数区别介绍
    • C++快速幂与大数取模算法示例
    • c语言链表基本操作(带有创建链表 删除 打印 插入)
    • 详解C语言中结构体的自引用和相互引用
    • 深入理解C++中常见的关键字含义
    • C++中的内存分区介绍

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有