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 返回值类型 方 ...
随机推荐
- ;(function($,window,document,undefined){})(jQuery,window,document)
;(function($,window,document,undefined){})(jQuery,window,doucment) 1.自调函数(function(){})() 2.好处是不会产生任 ...
- jquery--DOM操作基础
元素的访问 元素属性操作 获取:attr(name):$("#my").attr("src"); 设置:attr(name,value):$("#my ...
- checked和unchecked转换
static unsafe void Main(string[] args) { unchecked //checked 运行时候引发异常 { int n = int.MaxValue; n++; C ...
- Python 爬虫 (五)
# 头条街拍图片爬取 1 import re import requests from urllib import request import json import os i = 0 header ...
- Go 入门 - Go中的复杂类型
主要内容来自中文版的官方教程Go语言之旅 目的为总结要点 指针 Go 拥有指针.指针保存了值的内存地址. 类型 *T 是指向 T 类型值的指针.其零值为 nil. var p *int & 操 ...
- ajax的相关知识总结
一.ajax的工作原理 a.创建XMLHttpRequeat对象 var xmlhttp; if (window.XMLHttpRequest) { // IE7+, Firefox, Chrome, ...
- vuetify.js框架 下拉框数据改变DOM原数据未清除
今天遇到一个奇怪的bug 需求很简单,就是将“引擎能力”下拉框选中的值作为筛选条件传入到“样本类型”下拉框中,默认“样本类型”下拉框显示所有样本类型 看图: 如图所示,功能很简单. 其实还是对vuet ...
- 抓猫_KEY
抓猫 题面如下: [ 题目描述] 流浪猫布满城市的每一个角落, 非常影响市容市貌, 作为城市聘请的抓猫者, 你有一 种捕捉器, 一定可以捕捉到所有走到里面的猫, 更加幸运的是你有一个非常厉害的动物心理 ...
- 成都Uber优步司机奖励政策(2月24日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- cocos2dx - ActionManager内存泄露
ActionManager memory leak cocos2d-x3.7 都3.7了还有这样的bug,真是好难过,不过还是好开源的,谁都可以贡献一下 问题描述: 当创建一个node,并让它run一 ...