在c++的继承控制中,有三种不同的控制权限,分别是public、protected和private。定义派生类时,若不显示加上这三个关键字,就会使用默认的方式,用struct定义的类是默认public继承,class定义的类是默认private继承。这和Java有很大的不同,Java默认使用public继承,而且只有公有继承。

        1.使用public继承时,派生类内部可以访问基类中public和protected成员,但是类外只能通过派生类的对象访问基类的public成员。
        (1)基类的public成员在派生类中依然是public的。
        (2)基类中的protected成员在派生类中依然是protected的。
        (3)基类中的private成员在派生类中不可访问。
        2.使用protected继承时,派生类内部可以访问基类中public和protected成员,并且类外也不能通过派生类的对象访问基类的成员(可以在派生类中添加公有成员函数接口间接访问基类中的public和protected成员)。
        (1)基类的public成员在派生类中变为protected成员。
        (2)基类的protected成员在派生类中依然是protected成员。
        (3)基类中的private成员在派生类中不可访问。
       3.使用private继承时,派生类内部可以访问基类中public和protected成员,并且类外也不能通过派生类的对象访问基类的成员(可以在派生类中添加公有成员函数接口间接访问基类中的public和protected成员)。
        (1)基类的public成员在派生类中变成private成员。
        (2)基类的protected成员在派生类中变成private成员。
        (3)基类的private成员在派生类中不可访问。
        为了便于理解,我们用一个表格来说明这几种控制符使用的情况:

 

派 生 方 式  基类的public成员 基类的protected成员 基类的private成员
public派生 还是public成员 变成protected成员    不可见
protected派生 变成protected成员    变成protected成员    不可见
private派生 变为private成员 变为private成员 不可见
  1. #include<iostream>
  2. #include<cstdio>
  3. using namespace std;
  4.  
  5. class Biological{
  6. public:
  7. string property;
  8. virtual void prop(){
  9. cin>>property;
  10. cout<<"property:"<<property<<endl;
  11. }
  12.  
  13. private: // c++默认权限为private
  14. string name;
  15. void species(){
  16. cin>>name;
  17. cout<<"name:"<<name<<endl;
  18. }
  19.  
  20. protected:
  21. string belong;
  22. void bel(){
  23. cin>>belong;
  24. cout<<"belong:"<<belong<<endl;
  25. }
  26. };
  27.  
  28. class Animal:public Biological{// 公有继承
  29. public:
  30. void display(){
  31. prop();
  32. bel();
  33. //species(); // error: ‘void Biological::species()’ is private
  34. }
  35. };
  36.  
  37. class Plant:private Biological{ // 私有继承为默认可以省略
  38. public:
  39. void display(){
  40. prop();
  41. bel();
  42. //species(); // error: ‘void Biological::species()’ is private
  43. }
  44. };
  45.  
  46. class Both:protected Biological{ // 私有继承
  47. public:
  48. void display(){
  49. prop();
  50. bel();
  51. //species(); // error: ‘void Biological::species()’ is private
  52. }
  53. };
  54.  
  55. void animalDis(){
  56. Animal animal;
  57. animal.display();
  58. animal.property="cat";
  59. cout<<"修改animal.property为:"<<animal.property<<endl;
  60. // animal.name="xiaohei"; // error: ‘std::__cxx11::string Biological::name’ is private
  61. // cout<<"animal.name"<<animal.name<<endl;
  62. // animal.belong="animal"; // error: ‘std::__cxx11::string Biological::belong’ is protected
  63. // cout<<"animal.belong"<<animal.belong<<endl;
  64. }
  65.  
  66. void plantDis(){
  67. Plant plant;
  68. plant.display();
  69. // plant.property="tree"; // error: ‘std::__cxx11::string Biological::property’ is inaccessible
  70. // cout<<"修改plant.property为:"<<plant.property<<endl;
  71. // plant.name="poplar"; //error: ‘std::__cxx11::string Biological::name’ is private
  72. // cout<<"修改plant.name为:"<<plant.name<<endl;
  73. // plant.belong="plant"; //error: ‘std::__cxx11::string Biological::belong’ is protected
  74. // cout<<"修改plant.belong为:"<<plant.belong<<endl;
  75. }
  76.  
  77. void bothDis(){
  78. Both both;
  79. both.display();
  80. // both.property="tree"; // error: ‘std::__cxx11::string Biological::property’ is inaccessible
  81. // cout<<"修改both.property为:"<<both.property<<endl;
  82. // both.name="poplar"; // error: ‘std::__cxx11::string Biological::name’ is private
  83. // cout<<"修改both.name为:"<<both.name<<endl;
  84. // both.belong="plant"; // error: ‘std::__cxx11::string Biological::belong’ is protected
  85. // cout<<"修改both.belong为:"<<both.belong<<endl;
  86. }
  87.  
  88. int main(){
  89. animalDis();
  90. plantDis();
  91. bothDis();
  92. return ;
  93. }


————————————————
版权声明:本文为CSDN博主「扮猪吃饺子」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_28712713/article/details/80967650

C++ 公有继承、保护继承和私有继承的对比的更多相关文章

  1. Effective C++ 第二版 40)分层 41)继承和模板 42)私有继承

    条款40 通过分层来体现"有一个"或"用...来实现" 使某个类的对象成为另一个类的数据成员, 实现将一个类构筑在另一个类之上, 这个过程称为 分层Layeri ...

  2. c++继承详解:共有(public)继承,私有继承(private)继承,保护(protected)继承

    公有继承(public)继承.私有继承(private).保护继承(protected)是常用的三种继承方式. 1.公有继承(public) 公有继承的特点是基类的公有成员和保护成员作为派生类的成员时 ...

  3. C++学习笔记14,private/protected/public继承,私有继承,保护继承,公有继承(五)(总结)

    各种继承方式: 特征 公有继承 保护继承 私有继承 公有成员变为 派生类的公有成员 派生类的保护成员 派生类的私有成员 保护成员变为 派生类的保护成员 派生类的保护成员 派生类的私有成员 私有成员变为 ...

  4. C++ 中私有继承、保护继承与公有继承

    区别 下面通过一个示例来介绍三种继承的区别. 定义一个基类(假设为一个快退休的富豪): class RichMan { public: RichMan(); ~RichMan(); int m_com ...

  5. C++中公有继承、保护继承、私有继承的区别

    公有继承时基类中各成员属性保持不变,基类中private成员被隐藏.派生类的成员只能访问基类中的public/protected成员,而不能访问private成员:派生类的对象只能访问基类中的publ ...

  6. C++公有继承、保护继承和私有继承

    C++中的继承方式有: public.private.protected三种(它们直接影响到派生类的成员.及其对象对基类成员访问的规则). (1)public(公有继承):继承时保持基类中各成员属性不 ...

  7. C++之共有继承、保护继承、私有继承

    1.封装,public,private作用就是这个目的. 类外只能访问public成员而不能方位private成员: private成员只能被类成员和友元访问: 2.继承,protected的作用就是 ...

  8. C++公有继承、私有继承以及友元

    公有继承: 基类的成员在派生类中维持原来的访问权限,基类的publice成员为派生类的public成员,基类的protected成员为派生类的protected成员,基类的private成员在派生类的 ...

  9. C++ 继承方式 //语法:class 子类 :继承方式 父类 //继承方式 三种: //1.公共继承 //2.保护继承 //3.私有继承

    1 //继承方式 2 //语法:class 子类 :继承方式 父类 3 //继承方式 三种: 4 //1.公共继承 5 //2.保护继承 6 //3.私有继承 7 8 #include <ios ...

随机推荐

  1. 二、Spring装配Bean

    内容 声明bean 构造器注入和Setter方法注入 装配Bean 控制bean的创建和销毁 关键词 装配(wiring) 组件扫描(component scanning) 自动装配(AutoWiri ...

  2. 重学 Java 设计模式:实战原型模式

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 老板你加钱我的代码能飞 程序员这份工作里有两种人:一类是热爱喜欢的.一类是仅当成工作 ...

  3. Error C2079 'CMFCPropertySheet::m_wndOutlookBar' uses undefined class 'CMFCOutlookBar'

    Severity Code Description Project File Line Suppression StateError C2079 'CMFCPropertySheet::m_wndOu ...

  4. 练习使用shell在阿里云安装MySQL

    #!/bin/bash #阿里云初始安装MySQL #step1:查寻MariaDB 并卸载 MariaDB_filename=`rpm -qa|grep mariadb` if [ -d " ...

  5. PAT1090 危险品装箱 (25分) ——值得留意的map用法(int型与vector型的关联)

    1090 危险品装箱 (25分)   集装箱运输货物时,我们必须特别小心,不能把不相容的货物装在一只箱子里.比如氧化剂绝对不能跟易燃液体同箱,否则很容易造成爆炸. 本题给定一张不相容物品的清单,需要你 ...

  6. (Java实现) 车站

    题目描述 火车从始发站(称为第1站)开出,在始发站上车的人数为a,然后到达第2站,在第2站有人上.下车,但上.下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人.从第3站起( ...

  7. Java实现 LeetCode 508 出现次数最多的子树元素和

    508. 出现次数最多的子树元素和 给出二叉树的根,找出出现次数最多的子树元素和.一个结点的子树元素和定义为以该结点为根的二叉树上所有结点的元素之和(包括结点本身).然后求出出现次数最多的子树元素和. ...

  8. Java实现 LeetCode 472 连接词

    472. 连接词 给定一个不含重复单词的列表,编写一个程序,返回给定单词列表中所有的连接词. 连接词的定义为:一个字符串完全是由至少两个给定数组中的单词组成的. 示例: 输入: ["cat& ...

  9. Java实现 蓝桥杯VIP 算法训练 黑白无常

    算法训练 黑白无常 时间限制:1.0s 内存限制:256.0MB 问题描述 某寝室的同学们在学术完之后准备玩一个游戏:游戏是这样的,每个人头上都被贴了一张白色或者黑色的纸,现在每个人都会说一句话&qu ...

  10. java计算时间从什么时候开始 为什么从1970年开始 java的时间为什么是一大串数字

    Date date = new Date(0); System.out.println(date); 打印出来的结果: Thu Jan 01 08:00:00 CST 1970 也是1970 年 1 ...