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 返回值类型 方 ...
随机推荐
- chromium之histogram.h
histogram不知道是干啥的 // Histogram is an object that aggregates statistics, and can summarize them in // ...
- 笔记: 对称加密算法的PKCS5 和 PKCS7 填充
PKCS #7 填充字符串由一个字节序列组成,每个字节填充该填充字节序列的长度. 假设,块的长度是 8, 数据长度是 5 数据:AA AA AA AA AA PKCS#7 填充 AA AA AA AA ...
- lower_case_table_name
linux上是区分表名大小写的,但是可以通过 my.cnf文件中设置不区分! 1.找到my.cnf文件的所在地. find / -name my.cnf 找到这个文件的位置.我服务器上的位置是 /us ...
- linux系统基础之---文件系统与日志(基于centos7.4 1708)
- openstack之kvm常用操作
KVM虚拟机的管理主要是通过virsh命令对虚拟机进行管理. 1. 查看KVM虚拟机配置文件及运行状态 KVM虚拟机默认配置文件位置: /etc/libvirt/qemu/ autostart目录 ...
- Installing python-ldap in Ubuntu
These are the steps to be followed to install python-ldap in Ubuntu. At first, sudo apt-get install ...
- 北京Uber优步司机奖励政策(2月16日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...
- 生产环境 tidb部署实践
TiDB 简介 TiDB 是 PingCAP 公司受 Google Spanner / F1 论文启发而设计的开源分布式 HTAP (Hybrid Transactional and Analytic ...
- VINS(三)IMU预积分
IMU的数据频率一般远高于视觉,在视觉两帧k,k+1之间通常会有>10组IMU数据.IMU的数据通过积分,可以获取当前位姿(p位置,q四元数表达的姿态).瞬时速度等参数. 在VIO中,如果参考世 ...
- cakephp1.3中help form的一个小问题
如果我们在模版里这么干 <?php echo $form->input('last_sold_date',array('autocomplete'=>'off','label'=&g ...