protected、public、private
一、protected成员
1. 受保护的成员的可访问性
- 对于一个类的protected成员,①该类的用户(如类对象)不能访问它,②该类的派生类的成员(及其友元)可以访问它。
- 派生类的成员及其友元不能访问其基类对象的受保护成员,它们只能访问继承到派生类对象中的受保护成员
- 派生类的成员及其友元只能访问派生类对象中的基类部分的protected成员,不能访问普通的基类对象中的protected成员
借助下面的例子加深理解:
class Base {
protected:
int proc = 0;
};
class Derv : public Base {
void set_base_false()
{
Base b;
b.proc = 1; //[Error] 'int Base::proc' is protected
}
void set_base_true()
{
Derv d;
d.proc = 1;
}
void set_base_true2()
{
proc = 1; //访问该派生类继承而来的proc成员
}
};
二、三种继承方式
1. 派生访问说明符
对于派生类的成员及友元能否访问其直接基类的成员没什么影响
目的:控制派生类用户(包括派生类的派生类在内)对于基类成员的访问权限
2. 继承方式不影响派生类的成员及其友元访问基类的成员
class Base {
public:
void pub_mem();
protected:
int prot_mem;
private:
int priv_mem;
};
//公有继承
class Pub_derv : public Base {
int f1() { pub_mem(); }
int f2() { return prot_mem; }
int f3() { return priv_mem; } //错误:派生类不可访问private成员
};
//私有继承
class Priv_derv : private Base {
int f1() { pub_mem(); }
int f2() { return prot_mem; }
int f3() { return priv_mem; } //错误:派生类不可访问private成员
};
3. 继承方式影响派生类对象及其派生类访问基类的成员
公有继承:派生类中(从基类中)继承而来的成员都遵循其原有的访问说明符
私有继承:派生类中(从基类中)继承而来的成员的访问说明符都是private
保护继承:派生类中(从基类中)继承而来的成员,若其在基类中的访问说明符是public,则在派生类中的访问说明符变为protected
Pub_derv d1; //公有继承而来的派生类对象d1
Priv_derv d2; //私有继承而来的派生类对象d2
d1.pub_mem(); //正确:pub_mem()在派生类中是public的
cout << d1.prot_mem << endl; //错误:prot_mem在派生类中是protected的,但类的对象无法访问protected成员
d2.pub_mem(); //错误:pub_mem()在派生类中是private的
补充:其实题目中所说的基类的成员是指继承到派生类中的基类的成员(即,派生类的成员的基类部分)
三、派生类向基类转换的可访问性
0. 影响因素
使用该转换的代码
派生类的派生访问说明符
1. D继承自B
- D公有地继承B时,用户代码才能使用派生类向基类的转换(用户代码可访问B的公有成员)
- 如果B是D的直接基类,则D的成员和友元可以使用派生类向基类的转换(D的成员和友元可访问B的公有成员)
- D不是私有地继承B时,则D的派生类的成员和友元可以使用D向B的类型转换(D的派生类的成员和友元可访问B的公有成员)
小结:对于代码中的某个给定节点来说,如果基类的公有成员是可访问的,则派生类向基类的类型转换也是可访问的。
protected、public、private的更多相关文章
- 简述 private、 protected、 public、 internal 修饰符的访问权限
简述 private. protected. public. internal 修饰符的访问权限. private : 私有成员, 在该类的内部才可以访问. protected : 保护成员,该类内部 ...
- PHP中private、public、protected的区别详解
先简单粗俗的描述下:public 表示全局,类内部外部子类都可以访问:private表示私有的,只有本类内部可以使用:protected表示受保护的,只有本类或子类或父类中可以访问: 再啰嗦的解释下: ...
- 简述 private、protected、 public、 internal修饰符的访问权限
1.private: 私有的,只能在此类中访问 2.protected: 受保护的,只能在此类及其继承类中访问 3.public: 公开的,没有访问限制 4:internal: 内部的,只能在当前程序 ...
- private、public、protected和默认
类中的域最好标记为private: 方法最好标记为public: private:仅对本类可见 public:对所有类可见 protected:对本包和对所有子类可见 默认(什么都不写):对本包可见 ...
- JavaScript实现类的private、protected、public、static以及继承
JavaScript中的类 JavaScript实际上是一种弱类型语言,与C++和Java等语言不同.因此,在JavaScript中,没有强调类(class)这一概念,但实际运用中,类还是很重要的,比 ...
- private、 protected、 public、 internal 修饰符
private : 私有成员, 在类的内部才可以访问. protected : 保护成员,该类内部和继承类中可以访问. public : 公共成员,完全公开,没有访问限制. internal: 在同一 ...
- C++类:private、public、friend、protected的区别
private和public的作用是让编译器帮你检查某些模块是否使用了他没权限使用的模块,也就是生成可执行代码的时候做权限检查.比如,公司里各个部门有自己私有的信息,财务部可以看所有员工 ...
- private、 protected、 public、 internal 修饰符的访问权限
private : 私有成员, 在类的内部才可以访问. protected : 保护成员,该类内部和继承类中可以访问. public : 公共成员,完全公开,没有访问限制. internal: 当前程 ...
- private、public、this关键字
private关键字 概念:私有的,一种权限修饰符,用来修饰类的成员 特点:被修饰的成员只能在本类中访问 用法: - 1. private 数据类型 变量名: - 2. private 返回值类型 方 ...
随机推荐
- acm--1004
问题描述 再次比赛时间!看到气球在四周漂浮,多么兴奋.但要告诉你一个秘密,评委最喜欢的时间是猜测最流行的问题.比赛结束后,他们会统计每种颜色的气球并找出结果. 今年,他们决定离开这个可爱的工作给你. ...
- CentOS7 更换阿里云源
搭建opensack时原生的源不好使就换了个阿里云的源试试 百度搜到的方法:https://blog.csdn.net/chavo0/article/details/51939362 1.备份 # m ...
- linux 学习第九天
一.磁盘 (FHS:Filesystem Hierarchy Standard(文件系统层次化标准)的缩写) 1.常用目录 /var 主要存放经常变化的文件,如日志 /usr/local 用户自行 ...
- Delphi 拦截滚轮事件不响应滚轮的上下滚动
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms ...
- day 19 反射
1.isinstance, type, issubclass 的含义 isinstance: 判断你给对象时候是xxx类型的.(向上判断) type: 返回xxx对象的数据类型 issubclass ...
- django创建第一个子应用-3
在Web应用中,通常有一些业务功能模块是在不同的项目中都可以复用的,故在开发中通常将工程项目拆分为不同的子功能模块,各功能模块间可以保持相对的独立,在其他工程项目中需要用到某个特定功能模块时,可以将该 ...
- ajax重定向登录页
/** * ajax默认设置 * 包括默认提交方式为POST, * 判断后台是否是重定向 */ $.ajaxSetup( { //设置ajax请求结束后的执行动作 complete : functio ...
- AtCoder Regular Contest 100 E - Or Plus Max
一道很好的dp题 dp[K]存的是 i满足二进制1属于K二进制1位置 最大的两个Ai 这样dp[K]统计的两个数肯定满足(i | j) <= K 然后不断做 update(dp[i | (1&l ...
- nodejs multer
nodejs上传文件multer var multer = require('multer') var storage = multer.diskStorage({ destination: func ...
- BZOJ1222_ 产品加工_KEY
题目传送门 我们设f[i]表示用机器A加工,时间还剩下i时的最优加工时间. 对于每一个时间可以加工的物品,有以下几个选择: 1.用机器A加工 2.用机器B加工 3.A和B一起加工 所以得到方程: f[ ...