IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> c++ 专题 2 面向对象:类的访问权限 -> 正文阅读

[C++知识库]c++ 专题 2 面向对象:类的访问权限

文章目录


写在前面:

对于访问权限,必须明确一点:每个类负责定义各自的接口;要想与类的对象交互必须使用该类的接口,即使这个对象是派生类的基类部分也是如此。


对类的访问可以分为三类:用户,类的实现者,派生类;

  • 用户使用类的对象,只能访问类的公有成员;
  • 类的实现者负责编写类的成员,能访问类的公有部分,受保护部分以及私有部分;
  • 派生类除了作为派生类的实现者(访问派生类的公有部分,受保护部分以及私有部分)之外还能够访问基类的公有部分以及受保护部分;

考虑:派生类无法访问基类对象的受保护成员,派生类可以访问派生类对象中基类的受保护成员;
说明:这句话的表述是正确的。首先,对于类的继承,派生类会继承基类的的成员,使得这些成员作为派生类的成员。然而继承并不代表具有访问权限,这些成员的访问权限是由基类定义的。对于后半句,指的是派生类能够访问派生类成员(从基类继承来的受保护成员),本质是类对自己成员的访问权限;对于前半句,指的是派生类无法访问基类成员,本质是类对其他类成员的访问权限;

class Base{
protected:
    int a;
};
class Derived:public Base{
public:
    void fun1(Base A){cout<<A.a<<endl;};      //不能访问
    void fun2(Derived B){cout<<B.a<<endl;};   //能访问
    void fun3(){cout<<a<<endl;};              //能访问
    
};

对于访问说明符

成员访问说明符的作用:将类的成员声明为公有的,私有的,受保护的;

派生访问说明符的作用:指定从基类中继承来的成员是否对派生类的用户可见;

  • 如果派生类的继承是公有的,则继承原有的成员访问说明符;
  • 如果派生类的继承是私有的,则基类成员在派生类中都是私有的;
  • 如果派生类的继承是受保护的,则基类成员在派生类中都是受保护的;

说明:每个类通过成员访问说明符定义自己成员的访问权限,而不可能通过其他类包括派生类来改变自己成员的访问权限,即类的成员访问权限与派生访问说明符无关。派生访问说明符可以理解为是,对于从基类中继承来的成员,作为派生类的成员,其访问权限由派生访问说明符指定,即这些成员的访问权限受到两个因素影响

  • 基类中该成员的访问说明符;
  • 派生列表中的访问说明符;
class Base{
public:
    int a;
protected:
    int b;
};
class DerivedPublic:public Base{
    void fun1(){cout<<b<<endl;};    //正确
};
class DerivedPrivate:private Base{  
    void fun2(){cout<<b<<endl;};     //正确
};
class Derived_DerivedPublic:public DerivedPublic{
    void fun3(){cout<<b<<endl;};     //正确,Base::b 在 DerivedPublic 是受保护的
};
class Derived_DerivedPrivate:public DerivedPrivate{
    void fun4(){cout<<b<<endl;};     //错误,Base::b 在 DerivedPrivate 是私有的
};
int main(){
    DerivedPublic A;
    DerivedPrivate B;
    cout<<A.a<<endl;     //正确,Base::a 在 DerivedPublic 是公有的
    cout<<B.a<<endl;     //错误,Base::a 在 DerivedPrivate 是私有的
};

改变个别成员的可访问性:可以使用 using 改变某个成员的派生访问权限;

class Base{
public:
    int a;
};
class Derived:private Base{   //private 继承 
public:
	using Base::a;   //将 a 声明为公有的
};

对于友元:可以将类或函数声明为其他类的友元,以此来访问其他类的成员,包括公有,受保护,私有。

需要注意的是:

  • 友元关系不能传递,不能继承;

  • 关键字 friend 仅仅指定了访问权限而不等于函数声明,一般的,在指定为友元前应该先声明类或函数;

  • 不能把其他类的私有成员函数声明为友元;

  • 声明重载函数作为友元,需要对这组函数的每一个分别声明;

class BaseFriend;
class Base{
protected:
    int a;
    friend BaseFriend;
};
class DerivedFriend;
class Derived:public Base{
private:
    int b;
    friend DerivedFriend;
};
class BaseFriend{
public:
    void fun1(Base A){ cout<<A.a<<endl;};    //正确:友元 BaseFriend 能访问 Base 的受保护成员
    void fun2(Derived B){cout<<B.b<<endl;};  //错误:友元 BaseFriend 无法访问 Base 的派生类 Derived 的私有成员
    void fun3(Derived B){cout<<B.a<<endl;};  //正确:友元 BaseFriend 能访问 Base 内嵌在派生类 Derived 中的成员
};
class DerivedFriend{
public:
    void fun4(Base A){cout<< A.a<<endl;};  //错误:友元 DerivedFriend 无法访问 Derived 的基类对象 Base 的受保护成员
};

//对于 fun2,友元的关系不能继承;
//对于 fun4,每个类负责定义各自的接口;
//对于 fun3,友元对基类的可访问性包括了对内嵌在其派生类的基类成员的访问;

struct 和 class 的区别

? 二者的唯一区别在于所属成员的默认权限上

  • 对于成员访问说明符:class 默认是 private,struct 默认是 public;
  • 对于派生访问说明符:class 默认是 private 继承,struct 默认是 public;
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-07-17 16:02:42  更:2022-07-17 16:06:49 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 17:01:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码