C++(笔记)浅谈protected
来源:互联网 发布:压缩的js还原 编辑:程序博客网 时间:2024/05/16 10:24
一个类使用protected关键字来声明是希望与派生类分享但是不想被其他公共访问使用的成员。所以protected可以看做public和private的中间产物
解析protected
1.类似于私有成员,受保护的成员对于类的用户(类的用户即类的对象)来说是不可访问的,也就是说可以通过类的成员函数访问而不能通过类的对象来访问
2.类似于公有成员,受保护的成员对于派生类的成员和友元来说是可访问的,而private基类成员对于派生类成员和友元是不能访问的
3.派生类的成员或友元只能通过派生类的对象来访问基类受保护成员,而派生类对基类的对象受保护成员—无权限
代码解析第三点
1.
#include <iostream>using namespace std;class Base{protected: int prot_mem; };class Derive:public Base{public: friend void Call(Derive &a);//能访问Derive::prot_mem //friend void Call(Base &b);//不能访问Base::prot_mem private: int j; };void Call(Derive &a){ a.j=a.prot_mem=0; cout<<a.j<<endl;}//void Call(Base &b)//{// b.prot_mem=0;// cout<<b.prot_mem=0;//}int main(){ Derive c; Call(c); //Base d; //Call(d); return 0;}//友元或派生类可以访问Derive对象的private和protected成员(这里的成员包括基类中的)
结果
2.
若检查是否能访问Base对象的protected
#include <iostream>using namespace std;class Base{protected: int prot_mem; };class Derive:public Base{public: friend void Call(Derive &a);//能访问Derive::prot_mem friend void Call(Base &b);//不能访问Base::prot_mem private: int j; };void Call(Derive &a){ a.j=a.prot_mem=0; cout<<a.j<<endl;}void Call(Base &b){ b.prot_mem=0; cout<<b.prot_mem=0;}int main(){ Derive c; Call(c); Base d; Call(d); return 0;}
**这段代码是不能通过编译的因为在派生类中的友元函数访问Base对象的protected了即
浅谈代码
重点在于两个友元(不用也可以)能否访问Derive对象的private和protected成员和能否访问Base对象的protected成员
权限解释
- 因为派生类(及其友元)但友元又不是基类的友元,那么若派生类(及其友元)能改变Base对象的内容,那我们只要定义一个形如Derive的新类就能简单躲避protected提供的访问权限了,但这显然是不对的,并不是protected的初衷
- 派生类的成员和友元只能访问派生类对象中其类受保护成员,对于普通的基类对象中的成员不具备特殊访问权限
部分参照c++ primer
3 0
- C++(笔记)浅谈protected
- C++(笔记)浅谈什么是继承机制
- 继承和Protected修饰符(C#)
- 学习笔记(四):public、private、protected
- C++-public,protected,private
- 【C++】public protected private
- C++private,protected,public。
- C#public/protected/private/internal/protected internal
- java学习笔记 --protected
- object-c的存取权限(public/protected/private)
- (C++)public private protected 的解释说明
- 小朋友学C++(4):public, protected, private
- C++笔记(2)public,private,protected关键字
- 浅谈Java private default protected public
- C#---public-private-protected-internal
- objective-c @private @protected @public
- c++_public,protected,private访问
- c++学习笔记--protected成员
- Linux USB驱动框架分析
- unit7进程
- i春秋的戏说春秋writeup
- Android监听home键的方法
- 开始学习
- C++(笔记)浅谈protected
- 关于define 的疑惑
- struct_and_sort_and_structSort
- 51nod 1066 bash游戏
- 修改VS属性页中的Inherited values
- 130. Surrounded Regions
- Linux运维笔记-文档总结-文档与权限
- XML之DOM解析方式
- ubuntu 16.04 安装 opencv +contrib (3.2.0) + python 3.5