c/c++再学习:C++中public、protect、private的访问权限控制
C++中public、protect、private的访问权限控制
访问权限
一个类的public成员变量、成员函数,可以通过类的成员函数、类的实例变量进行访问
一个类的protected成员变量、成员函数,无法通过类的实例变量进行访问。但是可以通过类的友元函数、友元类进行访问。
一个类的private成员变量、成员函数,无法通过类的实例变量进行访问。但是可以通过类的友元函数、友元类进行访问。
访问权限demo
#include <iostream>
class ReferencePerission
{
friend class FriendClass;
friend void FriendFunc();
public:
int public_num;
void public_func(){std::cout <<"public_func "<<public_num<<std::endl;}
protected:
int protected_num;
void protected_func(){std::cout <<"protected_func "<<protected_num<<std::endl;}
private:
int private_num;
void private_func(){std::cout <<"private_func "<<private_num<<std::endl;}
};
class FriendClass
{
public:
FriendClass() {
std::cout<<"FriendClass"<<std::endl;
ReferencePerission ref;
ref.public_num = 1;
ref.protected_num = 2;
ref.private_num = 3;
ref.public_func();
ref.protected_func();
ref.private_func();
}
~FriendClass()
{
}
};
void FriendFunc()
{
std::cout<<"FriendFunc"<<std::endl;
ReferencePerission ref;
ref.public_num = 1;
ref.protected_num = 2;
ref.private_num = 3;
ref.public_func();
ref.protected_func();
ref.private_func();
}
int main()
{
ReferencePerission ref;
ref.public_num = 1;
//ref.protected_num = 2; /* 编译出错 declared protected here */
//ref.private_num = 3; /* 编译出错 declared private here */
ref.public_func();
//ref.protected_func(); /* 编译出错 declared protected here */
//ref.private_func(); /* 编译出错 declared private here */
FriendFunc(); /* 友元函数可以访问public,protected,private成员变量和函数 */
FriendClass friendObj; /* 友元类可以访问public,protected,private成员变量和函数 */
return 0;
}
继承权限
public继承
派生类通过public继承,基类的各种权限不变 。
派生类的成员函数,可以访问基类的public成员、protected成员,但是无法访问基类的private成员。
派生类的实例变量,可以访问基类的public成员,但是无法访问protected、private成员,仿佛基类的成员之间加到了派生类一般。
可以将public继承看成派生类将基类的public,protected成员囊括到派生类,但是不包括private成员。
protected继承
派生类通过protected继承,基类的public成员在派生类中的权限变成了protected 。protected和private不变。
派生类的成员函数,可以访问基类的public成员、protected成员,但是无法访问基类的private成员。
派生类的实例变量,无法访问基类的任何成员,因为基类的public成员在派生类中变成了protected。
可以将protected继承看成派生类将基类的public,protected成员囊括到派生类,全部作为派生类的protected成员,但是不包括private成员。
private成员是基类内部的隐私,除了友元,所有人员都不得窥探。派生类的友元,都不能访问
private继承
派生类通过private继承,基类的所有成员在派生类中的权限变成了private。
派生类的成员函数,可以访问基类的public成员、protected成员,但是无法访问基类的private成员。
派生类的实例变量,无法访问基类的任何成员,因为基类的所有成员在派生类中变成了private。
可以将private继承看成派生类将基类的public,protected成员囊括到派生类,全部作为派生类的private成员,但是不包括private成员。
private成员是基类内部的隐私,除了友元,所有人员都不得窥探。派生类的友元,都不能访问
总结:继承修饰符,就像是一种筛子,将基类的成员筛到派生类。public、protected、private,就是筛子的眼。
通过public继承,所有基类成员(除了private),public、protected都到了派生类里面,public筛眼比较大,不会改变访问权限。
通过protected继承,所有基类成员(除了private),public、protected都到了派生类里面,protected筛眼大小适中,所有过来的成员都变成了protected。
通过private继承,所有基类成员(除了private),public、protected都到了派生类里面,private筛眼最小,所有过来的成员都变成了private。
#include <iostream>
using namespace std;
class InheritPerission
{
public:
string public_str;
void public_func(){std::cout <<"public_func "<<public_str<<std::endl;}
protected:
string protected_str;
void protected_func(){std::cout <<"protected_func "<<protected_str<<std::endl;}
private:
string private_str;
void private_func(){std::cout <<"private_func "<<private_str<<std::endl;}
};
/*派生类通过public继承,基类的各种权限不变*/
class InheritPublic : public InheritPerission
{
public:
InheritPublic(){
/*派生类的成员函数,可以访问基类的public成员、protected成员,但是无法访问基类的private成员*/
public_str = "public_str";
protected_str = "protected_str";
//private_str = "private_str";
public_func();
protected_func();
//private_func();
}
~InheritPublic(){};
};
/*派生类通过protected继承,基类的public成员在派生类中的权限变成了protected 。protected和private不变*/
class InheritProtected : protected InheritPerission
{
public:
InheritProtected(){
/*派生类的成员函数,可以访问基类的public成员、protected成员,但是无法访问基类的private成员*/
public_str = "public_str";
protected_str = "protected_str";
//private_str = "private_str";
public_func();
protected_func();
//private_func();
}
~InheritProtected(){}
};
/*派生类通过private继承,基类的所有成员在派生类中的权限变成了private*/
class InheritPrivate : private InheritPerission
{
public:
InheritPrivate(){
/*派生类的成员函数,可以访问基类的public成员、protected成员,但是无法访问基类的private成员*/
public_str = "public_str";
protected_str = "protected_str";
//private_str = "private_str";
public_func();
protected_func();
//private_func();
}
~InheritPrivate(){}
};
int main()
{
InheritPublic inheritPublic;
InheritProtected inheritProtected;
InheritPrivate inheritPrivate;
/*派生类的实例变量,可以访问基类的public成员,但是无法访问protected、private成员*/
inheritPublic.public_func();
//inheritPublic.protected_func();
//inheritPublic.private_func();
/*派生类的实例变量,无法访问基类的任何成员,因为基类的public成员在派生类中变成了protected*/
//inheritProtected.public_func();
//inheritProtected.protected_func();
//inheritProtected.private_func();
/*派生类的实例变量,无法访问基类的任何成员,因为基类的所有成员在派生类中变成了private*/
//inheritPrivate.public_func();
//inheritPrivate.protected_func();
//inheritPrivate.private_func();
return 0;
}
c/c++再学习:C++中public、protect、private的访问权限控制的更多相关文章
- C++中public/protect/private三种访问权限控制
一.成员访问权限控制 1.public (1)public成员变量可以被成员函数访问 [访问性] (2)public成员可以被实体对象访问 [访问性] (3)public成员可以成为子类成员 [ ...
- Java中public,private,final,static等概念的解读
作为刚入门Java的小白,对于public,private,final,static等概念总是搞不清楚,到底都代表着什么,这里做一个简单的梳理,和大家分享,若有错误请指正,谢谢~ 访问权限修饰符 pu ...
- [转] Java中public,private,final,static等概念的解读
作为刚入门Java的小白,对于public,private,final,static等概念总是搞不清楚,到底都代表着什么,这里做一个简单的梳理,和大家分享,若有错误请指正,谢谢~ 访问权限修饰符 pu ...
- java中public与private还有protect的区别
java中public与private还有protect的区别 总是忘记.
- public protect private. 草稿。
public protect private. 草稿. #include <iostream> #include <thread> #include <memory> ...
- C++中public,protected,private派生类继承问题和访问权限问题
C++中public,protected,private派生类继承问题和访问权限问题 当一个子类从父类继承时,父类的所有成员成为子类的成员,此时对父类成员的访问状态由继承时使用的继承限定符决定. 1. ...
- java中4种修饰符访问权限的区别及详解全过程
java中4种修饰符访问权限的区别及详解全过程 http://jingyan.baidu.com/article/fedf0737700b3335ac8977ca.html java中4中修饰符分别为 ...
- (转)浅析Java中的访问权限控制
原文地址: http://www.cnblogs.com/dolphin0520/p/3734915.html 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下 ...
- 浅析Java中的访问权限控制
浅析Java中的访问权限控制 今天我们来一起了解一下Java语言中的访问权限控制.在讨论访问权限控制之前,先来讨论一下为何需要访问权限控制.考虑两个场景: 场景1:工程师A编写了一个类ClassA,但 ...
随机推荐
- 你需要Mobx还是Redux?
在过去一年,越来越多的项目继续或者开始使用React和Redux开发,这是目前前端业内很普遍的一种前端项目解决方案,但是随着开发项目越来越多,越来越多样化时,个人又有了不同的感受和想法.是不是因为已经 ...
- 请求转发 和 URL 重定向
五 请求转发 和 URL 重定向 1 请求转发和重定向 干什么用? 是我们在java后台servlet中 由一个servlet跳转到 另一个 servlet/jsp 要使用的技术 前端发送请求到后台 ...
- Java IO系列之四:NIO通信模型
分布式rpc框架有很多,比如dubbo,netty,还有很多其他的产品.但他们大部分都是基于nio的, nio是非阻塞的io,那么它的内部机制是怎么实现的呢. 1.由一个专门的线程处理所有IO事件,并 ...
- Angular记录(5)
文档资料 箭头函数--MDN:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/Arrow_fun ...
- Dynamic Clock in Terminal.
#!/bin/bash tput civis while [ 1 ] do tput clear # tput cup 10 20 info=$(date "+%Y-%m-%d %H:%M: ...
- java接口多实现和多继承
package test; interface mouth { public abstract void speak(); } interface nose{ public abstract void ...
- MDK调试无法进入main()函数
今天在用MDK调试stm32时出现了无法进入main函数,进入startup文件的情况. 在网上查找资料时发现,MDK调试设置断点最多只能设置5个.在减少断点后,调试果然能够正常进入main()函数了 ...
- Groovy闭包详解
Groovy闭包是一种可执行代码块的方法,闭包也是对象,可以向方法一样传递参数,因为闭包也是对象,因此可以在需要的时候执行,像方法一样闭包可以传递一个或多个参数.闭包最常见的用途就是处理集合,可以遍历 ...
- rsync + sersync 实现实时数据同步
一.环境: 主机1:youzhuan-bak centos 7.2 主机2:youzhuan-online centos 7.2 二.部署过程: youzhuan-bak : [root@ ...
- Android相关面试题---初识
一 .Activity的生命周期 Android是使用任务(Task)来管理活动的,一个任务就是一组存放在栈里的活动的集合,这个栈也被称为返回栈(Back Stack).每当我们启动一个新的活动,它会 ...