• 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

本文较为深入的探讨了C++继承中的访问控制,对深入掌握C++面向对象程序设计是非常必要的。具体内容如下:

通常来说,我们认为一个类有两种不同的用户:普通用户 和 类的实现者。其中,普通用户编写的代码使用类的对象,这部分代码只能访问类的公有(接口)成员;实现者则负责编写类的成员和友元的代码,成员和友元既能访问类的公有部分,也能访问类的私有部分。如果进一步考虑继承的话就会出现第三种用户,即派生类。派生类可以访问基类的公有(public)成员和受保护(protected)成员,但不能访问基类的私有(private)成员。

继承相关点如下:

①.大多数类都只继承自一个类,这种形式的继承叫做“单继承”。本文主要讲的是单继承。
②.一个派生类的对象中,包含继承自基类的部分和派生类自定义的部分。正因为派生类含有基类部分,所以可以进行派生类到基类的类型转换,这种转换是隐式的。
③.不存在从基类向派生类的隐式类型转换。
④.派生类向基类的自动类型转换只对指针或引用有效,对象之间不存在类型转换。
⑤.如果基类定义了静态成员,则不论派生出多少个派生类,每个静态成员都只存在唯一实例。
⑥防止一个类被继承可以使用关键字final,这时C++11新标准中提供的。

此外,读者还需要了解一下前面文章所介绍的继承中的虚函数与纯虚函数。

一、公有、私有和受保护成员

1 . 访问说明符

在C++中通过使用访问说明符public、protected、private来对类的成员进行访问控制,控制成员对于普通用户或派生类来说是否可访问:

public:定义为public的成员对普通用户、类的实现者、派生类都是可访问的。public通常用于定义类的外部接口。

protected:定义protected成员的目的是让派生类可以访问而禁止其他用户访问。所以类的实现者和派生类可以访问,而普通用户不能访问。

private:定义为private的成员只能被类的实现者(成员和友元)访问。private部分通常用于封装(即隐藏)类的实现细节。

class People{ 
protected: 
  string name; 
}; 
 
class Student : public People{ 
public: 
  friend void Print(Student &s); 
  friend void Print(People &p); 
}; 
 
// 正确,可以通过派生类对象访问基类的protected成员 
void Print(Student &s){ s.name="Songlee"; cout<< s.name << endl; } 
// 错误,不能通过基类对象访问基类的protected成员 
void Print(People &p){ p.name="Songlee"; cout<< p.name << endl; } 

</div>

需要注意的是,派生类的成员或友元只能通过派生类对象来访问基类的受保护成员。派生类对于一个基类对象中的受保护成员没有任何访问特权。

2 . 改变成员的可访问性

有时我们需要改变派生类继承的某个名字的访问级别,通过使用using声明:

class People{ 
protected: 
  string name; 
}; 
 
class Student : public People{ 
public: 
  using People::name; // 将继承来的name成员的访问权限改为public 
}; 
 
int main() 
{ 
  Student me; 
  me.name = "SongLee";   // 可以访问name了 
  cout << me.name << endl;  
  return 0; 
} 

</div>

通过在类的内部使用using声明语句,我们可以将该类的直接或间接基类中的任何可访问成员(非私有成员)标记出来,改变其访问权限。

二、公有、私有和受保护继承

我们注意到,在类的派生列表中用到了访问说明符public、protected和private,它们分别表示不同的继承方式:

class A : public B { /* */ };   // 公有继承 
class A : private B { /* */ };  // 私有继承 
class A : protected B { /* */ }; // 受保护继承 

</div>

派生类的派生列表中的访问说明符对于派生类的成员(及友元)能否访问其直接基类的成员没什么影响。派生类的成员(及友元)对基类成员的访问权限只与基类中的访问说明符有关。

那么派生列表中的访问说明符有什么作用呢?

派生列表中访问说明符的作用是控制派生类用户对于基类成员的访问权限,注意是派生类的用户。下面给出不同的继承方式导致的访问权限的变化:

public继承:如果继承是公有的,则成员将遵循其原有的访问说明符。父类中的public、protected和private属性在子类中不发生改变。

protected继承:比protected级别高的访问权限会变成protected。即父类中的public属性在子类中变为protected,父类中的protected和private属性在子类中不变。

private继承:比private级别高的访问权限会变成private。即父类中的三种访问属性在子类中都会变成private。

class A {  // 基类 
public: 
  string A_public;   // 公有成员 
protected: 
  string A_protected;  // 受保护成员 
}; 
 
class B : private A {  // 私有继承 
public: 
  B(){ A_public="public"; A_protected="protected"; }; 
}; 
 
int main() 
{ 
  B b;  // 通过B的对象访问 
  cout << b.A_public <<" "<< b.A_protected << endl;  // 错误,因为是私有继承 
  return 0; 
}

</div>

如果我们在派生列表中不使用访问说明符,则struct关键字默认的是公有继承,class关键字默认的是私有继承。不过建议在继承时最好显式地将访问说明符写出来。

另外,不同的继承方式也会影响派生类向基类的转换,假定Derive继承自Base:

1.只有当Derive公有地继承自Base时,用户代码才能使用派生类向基类的转换;如果Derive继承Base的方式是受保护的或者私有的,则用户代码不能使用该转换。

2.不论Derive以什么方式继承Base,Derive的成员函数和友元都能使用派生类向基类的转换;派生类向其直接基类的类型转换对于派生类的成员和友元来说永远是可访问的。

3.如果Derive继承Base的方式是公有的或者受保护的,则Derive的派生类的成员和友元可以使用Derive向Base的类型转换;反之,如果Derive继承Base的方式是私有的,则不能使用。

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

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

  • C++多重继承与虚继承分析
  • C++继承中的访问控制实例分析

相关文章

  • 2017-05-28深入解析C++中的函数模板和函数的默认参数
  • 2017-05-28利用C语言实现顺序表的实例操作
  • 2017-05-28C语言求两个字符串的最长公共子串
  • 2017-05-28C++编写简易的飞机大战
  • 2017-05-28基于memset()函数的深入理解
  • 2017-05-28C语言中的strdup()函数和其与strcpy()函数的区别
  • 2017-05-28cin.get()和cin.getline()之间的区别
  • 2017-05-28掌握C++编程中反斜杠续行符的使用方法
  • 2017-05-28C++实现位图排序实例
  • 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
  • 微信公众号

最近更新的内容

    • C++实现在文本中找出某个单词的位置信息
    • C++中基类和派生类之间的转换实例教程
    • linux下C语言中的mkdir函数与rmdir函数
    • C++入门概览和尝试创建第一个C++程序
    • C++短路求值(逻辑与、逻辑或)实例
    • C++中Operator类型强制转换成员函数解析
    • 深入理解C/C++中的写时拷贝
    • linux c多线程编程实例代码
    • C语言加减乘除运算
    • 深入解读C++中的指针变量

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

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