接上一篇文章https://blog.csdn.net/Master_Cui/article/details/109741735

四、public继承、protected继承和private继承

子类对继承的成员的访问权限受两个因素影响,第一个是继承成员在基类中的访问权限说明符,第二个是派生列表中的访问权限说明符。

派生列表的访问说明符的作用是:控制子类中的基类成员的访问权限。

也就是说,

如果是public继承,基类中的成员在子类中的访问权限不变(无法将protected和private变为public,因为会破坏封装)

如果是protected继承,基类中public成员在子类中的访问权限变为protected

如果是private继承,基类中public和protected成员在子类中的访问权限均变为private

示例1:public继承

class base
{
public:base(){cout<<__func__<<endl;}~base(){cout<<__func__<<endl;}int bpub;protected:int bpro;private:int bpri;
};struct derive: base
{
public:derive(){cout<<__func__<<endl;}~derive(){cout<<__func__<<endl;}void pubfunc() {bpub=10;}void profunc() {bpro=10;}
};int main(int argc, char const *argv[])
{derive t;t.bpub=10;//t.bpro=10;return 0;
}

上述代码必须将第28行注释掉,因为是public继承,使用子类时,基类中成员在子类中的访问权限不变,所以无法在子类中访问private成员,也无法在其他作用域访问protected成员

此外,第15行也说明:如果不指定派生列表访问说明符,那么使用struct定义的类的默认的派生列表访问说明符是public

示例2:protected继承

class base
{
public:base(){cout<<__func__<<endl;}~base(){cout<<__func__<<endl;}int bpub;protected:int bpro;private:int bpri;
};struct derive:protected base
{
public:derive(){cout<<__func__<<endl;}~derive(){cout<<__func__<<endl;}void pubfunc() {bpub=10;}void profunc() {bpro=10;}
};int main(int argc, char const *argv[])
{derive t;//t.bpub=10;//t.bpro=10;return 0;
}

上述代码必须将第27,28行注释掉,否则会出现如下错误

因为是protected继承,所以,使用子类时,基类中的public成员在子类中的访问权限变为protected,此时,只有子类成员和友元可以访问,所以无法在子类以外的其他作用域(比如main)访问

示例3:private继承

class base
{
public:base(){cout<<__func__<<endl;}~base(){cout<<__func__<<endl;}int bpub;protected:int bpro;private:int bpri;
};class derive:base
{
public:derive(){cout<<__func__<<endl;}~derive(){cout<<__func__<<endl;}void pubfunc() {bpub=10;}void profunc() {bpro=10;}
};int main(int argc, char const *argv[])
{derive t;t.bpub=10;t.bpro=10;return 0;
}

使用private继承时,道理同protected继承,在使用子类时,bpub和bpro都变成了子类的private成员,所以无法访问bpub和bpro

此外,第15行也说明:如果不指定派生列表访问说明符,那么使用class定义的类的默认的派生列表访问说明符是private

派生列表访问说明符不仅可以控制子类用户对于基类成员的访问权限,还可以控制继承子类的新子类的访问权限

示例

class base
{
public:base(){cout<<__func__<<endl;}~base(){cout<<__func__<<endl;}int bpub;protected:int bpro;private:int bpri;
};struct derive:private base
{
public:derive(){cout<<__func__<<endl;}~derive(){cout<<__func__<<endl;}void pubfunc() {bpub=10;}void profunc() {bpro=10;}
};class derive2:public derive
{
public:derive2(){cout<<__func__<<endl;}~derive2(){cout<<__func__<<endl;}void d2pubfunc() {bpub=10;}void d2profunc() {bpro=10;}
};

上述代码之所以无法编译通过,是因为derive private继承base,所以base中的public和protected成员都变成了private,而derive2继承derive后,访问了derive中的private成员,所以编译失败

所以,如果一个子类是private继承某个基类,那么就不要使用该子类作为其他新子类的基类,因为该子类中的大部分成员都是不可见的

派生列表的访问说明符不影响子类的成员和友元直接访问基类成员。

也就是说,无论哪种继承方式,子类对象都能访问父类的public和protected成员

示例

class base
{
public:base(){cout<<__func__<<endl;}~base(){cout<<__func__<<endl;}int bpub;protected:int bpro;private:int bpri;
};struct derive: private base
{
public:derive(){cout<<__func__<<endl;}~derive(){cout<<__func__<<endl;}void pubfunc() {bpub=10;}void profunc() {bpro=10;}//void prifunc(derive &d) {d.bpri=10;}
};

上述代码中无论子类继承基类的方式是啥,都不能违背子类对象可以在子类中可以访问父类的public和protected成员,但是不能访问private成员这一原则。

此外,无论是继承方式是啥,除private之外的可访问的基类成员最终都可以在子类中访问(因为继承后,可访问的基类的成员的访问权限无非就是public,protected和private)

所以,综合以上两点,可以编译成功。

参考

《C++ Primer》

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

C++知识点46——类继承中的类型转换与访问权限控制(中)相关推荐

  1. C++知识点47——类继承中的类型转换与访问权限控制(下)

    接上一篇文章https://blog.csdn.net/Master_Cui/article/details/109768311 五.派生类向基类转换的可访问性 当一个子类向基类转化时:有以下三条规则 ...

  2. C++知识点45——类继承中的类型转换与访问权限控制(上)

    一.类的继承与类型转换 1.概述 一般情况,如果想把一个类的指针或引用绑定到另外一个对象上,需要指针或者引用的类型与指向对象一致.但是存在继承关系的类是个例外:可以将基类的指针或者引用指向子类 原因是 ...

  3. C++_类和对象_封装_访问权限_C++中struct和class的区别---C++语言工作笔记037

    然后我们再来看c++中的访问权限控制,其实这个跟java中的很像 可以看到有3个,public 是类内类外都可以访问 protected 是保护权限,在类内可以访问,但是在类外不行.  这个在子类的时 ...

  4. android 静态方法 构造方法,android基础-Java篇02:类和对象、构造方法、访问权限控制、重载、this关键字、static关键字...

    一.类和构造方法 (类和对象在百度百科已经有详细的介绍,这里只做简单的描述以及帮助理解:百度百科:类和对象,需要注意的是,百度百科类和对象的举例中都是C++,书写格式不要和Java混淆!) 什么是类? ...

  5. JAVA接口的访问权限_Java中访问权限-类和接口

    (1)类和接口的访问权限种类一样 , 有两中public,default,它们的不同在于是否能访问不同包中的类或接口 default:只能在本包中访问 public:任何地方都可以访问,当然不同的包中 ...

  6. java 类成员访问权限_Java类成员访问权限控制知识总结

    一 前言 这篇文章是很基础的一文,没多大深度,对于开发人员必然是熟练于心.本篇文章的主题是为什么java要设置类成员访问级别?其原因也很简单,就是为了面向对象的封装特性:将类成员使用不同的访问级别控制 ...

  7. Java中的四种访问权限:public、protected、包访问、private

    所谓访问权限,指的就是本类中的成员变量.成员方法对其他类的可见性 试想一想,当我们修改一个非常庞大的项目时,如果所有变量和方法都是公共权限,那么后端中任何类都有权限去修改它的变量和方法,很有可能修改后 ...

  8. C++知识点11——this指针,const成员函数,访问权限控制

    1.this指针 每个类都有this指针,this指针指向this指针指向的是类的对象本身 class A { public:A() {}~A() {}void func() {cout<< ...

  9. private访问权限java_Java中的访问权限控制

    Java提供了public, private, protected 三个访问权限修饰词,提供了以下四种访问权限控制机制: 1.包访问权限: 2.Public访问权限: 3.Private访问权限: 4 ...

最新文章

  1. CV之后,纯MLP架构又来搞NLP了,性能媲美预训练大模型
  2. error: No curses/termcap library found的解决办法
  3. excel保存成matlab,matlab数据保存为excel文件
  4. iPhone判断是否已插入SIM卡
  5. windows 批处理自学教程 基础篇
  6. html5 拖拽滚动条,js 简易版滚动条实例(适用于移动端H5开发)
  7. 手机上的星号键和井号键有什么用?
  8. QQ特性,决定了杀死进程不能收到电话呼叫
  9. 一次函数的斜率公式_一次函数正比例的公式是什么
  10. 打开FTP server或者wftpd32提示 unknow error 10013
  11. 包含资金约束的多阶段报童模型
  12. mysql删除语句菜鸟教程_Mysql基本的增删改查
  13. (本人亲测有效)华为magicbook 16SE笔记本电脑重装系统过程
  14. 强烈推荐一款好用的API接口
  15. pytorch保存模型pth_pytorch模型文件pth详解
  16. Linux下通过已连上无线的真机使虚拟机可上网
  17. matlab graythresh()函数使用的注意点
  18. Chem 3D中怎么创建立体模型
  19. linux检查网络命令总结
  20. 我人生的两大梦想是: 睡觉睡到自然醒 数钱数到手抽筋

热门文章

  1. 图案研究2--九格定义
  2. 开源加持 NFV借势OPNFV实现进阶之路
  3. 如何证明你的性能测试结果可信?
  4. Framework启动过程浅析
  5. [转]PHP: 深入pack/unpack
  6. 【转】BT5汉化步骤
  7. ffmpeg命令 音频文件格式转换
  8. java多态性补充-instanceof关键字
  9. LeetCode 206. 反转链表(Reverse Linked List) 16
  10. sqlserver 把两个sql查询语句查询出来的两张表合并成一张表