• 【C++】继承 ② ( 继承语法 | 三种继承 - 共有继承 / 保护继承 / 私有继承 | 继承与父类私有成员 | 子类访问父类私有成员 | 代码示例 )






    一、继承语法




    1、语法说明


    继承语法 : 使用 class 关键字 定义 子类 , 在 子类后面 使用 冒号 : 与 若干父类隔开 ;

    class 子类名称 : 父类列表
    {
    	// 子类成员
    };
    
    • 1
    • 2
    • 3
    • 4

    父类列表格式 : 上述 " 父类列表 " 的格式如下 , 父类列表 由 若干父类组成 , 可以是 一个 , 也可以是 多个 ;

    访问控制 父类名称 , 访问控制 父类名称 , ... , 访问控制 父类名称 ; 
    
    • 1

    2、三种继承 - 共有继承 / 保护继承 / 私有继承


    访问控制符 : 访问控制符 用于 设置 继承的方式 ;

    • public : 公有继承
      • Child 类继承了 Parent 类的所有公有和保护成员 , 访问级别不变 , 并且可以访问它们 ;
      • Child 类不能继承 Parent 类的私有成员 ;
    • protected : 保护继承
      • Child 类继承了 Parent 类的所有公有和保护成员 , 这些成员会被声明为 保护成员 , 只能在类内部 或 子类中 访问它们 ;
      • Child 类不能继承 Parent 类的私有成员 ;
    • private : 私有继承
      • Child 类继承了 Parent 类的所有公有和保护成员 , 这些成员会被声明为私有的 , 只能在类内部访问它们 ;
      • Child 类不能继承 Parent 类的私有成员 ;

    3、继承与父类私有成员


    C++ 的 三种继承

    • 公有继承 public
    • 保护继承 protected
    • 私有继承 private

    只针对 父类 的 " 公有成员 " 和 " 保护成员 " , 这两种成员是可以被继承的 ;


    父类的 " 私有成员 " 是无法被子类 继承 和 访问 的 ; 父类的 私有成员 只能在 父类中 , 由父类自己的成员访问 ;

    除 父类 之外的任何类 , 包括子类 , 都不能访问 父类的 私有成员 , 这是为了保护 类的 封装性 和 安全性 而制定的规则 ;


    4、子类访问父类私有成员


    子类 不能直接访问 父类的 私有成员 ,

    但是可以通过在 父类 中提供 公有 或 保护 的 成员函数 来访问这些私有成员 ;

    这些成员函数可以在子类中重写或复用 , 以便让子类能够访问和操作基类的私有成员 ;


    如果在 子类 中 尝试访问 父类 的 私有成员 , 会报如下错误 :

    Test.cpp(34,1): error C2248: “Parent::privateFun”: 无法访问 private 成员(在“Parent”类中声明)
    Test.cpp(18): message : 参见“Parent::privateFun”的声明
    Test.cpp(6): message : 参见“Parent”的声明
    
    • 1
    • 2
    • 3

    在这里插入图片描述





    二、代码示例 - 继承语法



    代码示例 :

    #include "iostream"
    using namespace std;
    
    #include   
    
    class Parent {
    public:
        void publicFun() {
            cout << "父类公有成员" << endl;
        }
    
    protected:
        void protectedFun() {
            cout << "父类保护成员" << endl;
        }
    
    private:
        void privateFun() {
            cout << "父类私有成员" << endl;
        }
    };
    
    // 子类 公有继承 父类
    class Child : public Parent {
    public:
        void publicFunChild() {
            // 子类 可以访问 父类 的公有成员 
            publicFun();   
    
            // 子类 可以访问 父类 的保护成员 
            protectedFun();
    
            // 任何类型的继承 都不能访问 父类的私有成员
            //privateFun();
        }
    };
    
    int main() {
    
        Child c;
        c.publicFunChild();
    
    	// 控制台暂停 , 按任意键继续向后执行
    	system("pause");
    
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    执行结果 :

    父类公有成员
    父类保护成员
    Press any key to continue . . .
    
    • 1
    • 2
    • 3

    在这里插入图片描述

  • 相关阅读:
    基于Docker部署OpenLDAP,同时集成第三方系统(GitLab、JIRA等)
    先进制造aps专题三 为什么java语言不适合作为aps算法的开发语言
    云呐|机房监控服务平台,机房监控服务平台有哪些
    pytorch 对图片进行归一化处理
    关于在搭建微服务项目中使用openfeign作为rpc框架调用时,枚举对象无法进行转换问题
    记录linux交叉编译samba服务移植至Hi3559AV100
    LeetCode讲解篇之151. 反转字符串中的单词
    Java八股文基础
    Redis 缓存数据库
    ChatGPT在职业规划中的智能助手
  • 原文地址:https://blog.csdn.net/han1202012/article/details/133804269