public、private、protected三者访问权限解析

2024-04-07 04:58

本文主要是介绍public、private、protected三者访问权限解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#include <iostream>
using namespace std;/**************** private ****************/
// 1-1.能被该类中的函数访问
// 1-2.能被其友元函数访问。
// 1-3.不能被任何其他访问,该类的对象也不能访问。
/**************** protected ****************/
// 2-1.能被该类中的函数访问
// 2-2.能被子类的函数访问
// 2-3.能被其友元函数访问。 
// 2-4.不能被该类的对象访问。
/**************** public ****************/
// 3-1.能被该类中的函数访问
// 3-2.能被子类的函数访问
// 3-3.能被其友元函数访问
// 3-4.能被该类的对象访问。
/****************  默认权限(default) ****************/
// 类,数据成员,构造方法,方法成员,都能够使用默认权限,即不写任何关键字。
// 默认权限即同包权限,同包权限的元素只能在定义它们的类中,以及同包的类中被调用。// 注:友元函数包括3种:设为友元的普通的非成员函数;设为友元的其他类的成员函数;设为友元类中的所有成员函数。class ExpClass
{
public:ExpClass(){};ExpClass(int a):PrivateData(a){}ExpClass(int a, int b):PrivateData(a),PublicData(b){}void fun(int a, int b);friend void fun1(ExpClass f, int a);
private:int PrivateData;
protected:int ProtectedData;
public:int PublicData;
};class SonExpClass : ExpClass
{
public:SonExpClass(){};SonExpClass(int a):SonPrivateData(a){}SonExpClass(int a, int b, int c):SonPrivateData(a),SonProtectedData(b),SonPublicData(c){}void Sonfun(int a, int b);
//	friend void Sonfun1(ExpClass f, int a);
private:int SonPrivateData;
protected:int SonProtectedData;
public:int SonPublicData;
};void ExpClass::fun(int a, int b)
{PrivateData = a+b;   // 1-1.成员函数可以访问private类型cout<<"1-1.成员函数可以访问private类型PrivateData="<<PrivateData<<endl;ProtectedData = a-b; // 2-1.成员函数可以访问private类型cout<<"2-1.成员函数可以访问protected类型ProtectedData="<<ProtectedData<<endl;PublicData = a*b; // 3-1.成员函数可以访问public类型cout<<"3-1.成员函数可以访问public类型PublicData="<<PublicData<<endl;
}void SonExpClass::Sonfun(int a, int b)
{ProtectedData = 10;PublicData = 10;int temp1 = ProtectedData+a+b; // 2-2.子类的函数可以访问protected类型cout<<"2-2.子类的函数可以访问protected类型ProtectedData+"<<a<<"+"<<b<<"="<<temp1<<endl;int temp2 = PublicData+a*b; // 3-2.子类的函数函数可以访问public类型cout<<"3-2.子类的函数可以访问public类型PublicData+"<<a<<"*"<<b<<"="<<temp2<<endl;
}void fun1(ExpClass f, int a)
{int temp1 = a+f.PrivateData;   // 1-2.友元函数可以访问private类型cout<<"1-2.友元函数可以访问private类型"<<a<<"+PrivateData"<<"="<<temp1<<endl;// cout<<a+PrivateData<<endl;// 不能这样访问int temp2 = a-f.ProtectedData;    // 2-3.友元函数可以访问protected类型cout<<"2-3.友元函数可以访问protected类型"<<a<<"-ProtectedData"<<"="<<temp2<<endl;int temp3 = a*f.PublicData;    // 3-3.友元函数可以访问public类型cout<<"3-3.友元函数可以访问public类型"<<a<<"*PublicData"<<"="<<temp3<<endl;
}void main()
{cout<<"************************基类A1************************"<<endl;ExpClass A1(0);A1.fun(5, 3);fun1(A1, 10);// cout<<A1.PrivateData<<endl; // 1-3.错误,private类型变量不能被类的对象所访问// cout<<A1.ProtectedData<<endl; // 2-4.错误,protected类型变量不能被类的对象所访问cout<<"3-4.类的对象可访问public类型A1.PublicData="<<A1.PublicData<<endl;cout<<endl;cout<<"************************子类B1************************"<<endl;SonExpClass B1(0, 0, 0);B1.Sonfun(20, 30);// cout<<B1.PublicData<<endl;  // 子类的对象不能访问父类的public类型变量// B1.fun(1, 2);  // 子类的对象不能访问父类的public类型函数
}


附表:基类成员和基类子对象成员在派生类中的访问权限

派生方式  基类中的访问控制基类的public成员基类的protected成员基类的private成员派生方式引起的访问属性变化概括
private派生变为private成员变为private成员不可见基类中的非私有成员都成为派生类中的私有成员
protected派生变为protected成员变为protected成员不可见基类中的非私有成员在派生类中的访问属性都降一级
public派生仍为public成员仍为protected成员不可见基类中的非私有成员在派生类中的访问属性保持不变

 


这篇关于public、private、protected三者访问权限解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/881693

相关文章

Spring Boot 3.x 中 WebClient 示例详解析

《SpringBoot3.x中WebClient示例详解析》SpringBoot3.x中WebClient是响应式HTTP客户端,替代RestTemplate,支持异步非阻塞请求,涵盖GET... 目录Spring Boot 3.x 中 WebClient 全面详解及示例1. WebClient 简介2.

在MySQL中实现冷热数据分离的方法及使用场景底层原理解析

《在MySQL中实现冷热数据分离的方法及使用场景底层原理解析》MySQL冷热数据分离通过分表/分区策略、数据归档和索引优化,将频繁访问的热数据与冷数据分开存储,提升查询效率并降低存储成本,适用于高并发... 目录实现冷热数据分离1. 分表策略2. 使用分区表3. 数据归档与迁移在mysql中实现冷热数据分

C#解析JSON数据全攻略指南

《C#解析JSON数据全攻略指南》这篇文章主要为大家详细介绍了使用C#解析JSON数据全攻略指南,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、为什么jsON是C#开发必修课?二、四步搞定网络JSON数据1. 获取数据 - HttpClient最佳实践2. 动态解析 - 快速

Spring Boot3.0新特性全面解析与应用实战

《SpringBoot3.0新特性全面解析与应用实战》SpringBoot3.0作为Spring生态系统的一个重要里程碑,带来了众多令人兴奋的新特性和改进,本文将深入解析SpringBoot3.0的... 目录核心变化概览Java版本要求提升迁移至Jakarta EE重要新特性详解1. Native Ima

WinForm跨线程访问UI及UI卡死的解决方案

《WinForm跨线程访问UI及UI卡死的解决方案》在WinForm开发过程中,跨线程访问UI控件和界面卡死是常见的技术难题,由于Windows窗体应用程序的UI控件默认只能在主线程(UI线程)上操作... 目录前言正文案例1:直接线程操作(无UI访问)案例2:BeginInvoke访问UI(错误用法)案例

spring中的@MapperScan注解属性解析

《spring中的@MapperScan注解属性解析》@MapperScan是Spring集成MyBatis时自动扫描Mapper接口的注解,简化配置并支持多数据源,通过属性控制扫描路径和过滤条件,利... 目录一、核心功能与作用二、注解属性解析三、底层实现原理四、使用场景与最佳实践五、注意事项与常见问题六

nginx中端口无权限的问题解决

《nginx中端口无权限的问题解决》当Nginx日志报错bind()to80failed(13:Permissiondenied)时,这通常是由于权限不足导致Nginx无法绑定到80端口,下面就来... 目录一、问题原因分析二、解决方案1. 以 root 权限运行 Nginx(不推荐)2. 为 Nginx

nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析(结合应用场景)

《nginx-t、nginx-sstop和nginx-sreload命令的详细解析(结合应用场景)》本文解析Nginx的-t、-sstop、-sreload命令,分别用于配置语法检... 以下是关于 nginx -t、nginx -s stop 和 nginx -s reload 命令的详细解析,结合实际应

MyBatis中$与#的区别解析

《MyBatis中$与#的区别解析》文章浏览阅读314次,点赞4次,收藏6次。MyBatis使用#{}作为参数占位符时,会创建预处理语句(PreparedStatement),并将参数值作为预处理语句... 目录一、介绍二、sql注入风险实例一、介绍#(井号):MyBATis使用#{}作为参数占位符时,会

PostgreSQL的扩展dict_int应用案例解析

《PostgreSQL的扩展dict_int应用案例解析》dict_int扩展为PostgreSQL提供了专业的整数文本处理能力,特别适合需要精确处理数字内容的搜索场景,本文给大家介绍PostgreS... 目录PostgreSQL的扩展dict_int一、扩展概述二、核心功能三、安装与启用四、字典配置方法