当前位置: 首页 > article >正文

C++的中的继承

最近还有人问关于C++的继承权限问题,出一篇博客说一下, 在C++中,成员变量和函数的访问控制主要通过访问权限修饰符public, protected, private)来实现;继承方式(public, protected, private)决定了派生类如何继承基类的成员,以及对外部访问的影响。以下是详细解释:


1. 成员访问权限修饰符

在一个类中,成员变量或成员函数的访问权限有以下三种:

  • public(公共):

    • 可以在类的内部和外部访问。
    • 通常用于提供接口(函数)或暴露必须访问的成员变量。
    class Example {
    public:
        int x;       // 公共成员
        void show(); // 公共函数
    };
    
  • protected(保护):

    • 只能在类的内部、派生类中访问。
    • 不能被类外部直接访问。
    class Example {
    protected:
        int x;       // 保护成员
        void show(); // 保护函数
    };
    
  • private(私有):

    • 只能在类的内部访问。
    • 类外部或派生类中均无法直接访问。
    class Example {
    private:
        int x;       // 私有成员
        void show(); // 私有函数
    };
    
修饰符类内访问派生类访问外部访问
public✔️✔️✔️
protected✔️✔️
private✔️

2. 继承方式对访问权限的影响

在继承时,可以通过publicprotectedprivate来定义继承方式,它们会影响基类成员在派生类中的访问权限。

public继承:

基类的访问权限在派生类中保持不变:

  • 基类的public成员仍为public
  • 基类的protected成员仍为protected
  • 基类的private成员不可访问。
class Base {
public:
    int a;
protected:
    int b;
private:
    int c;
};

class Derived : public Base {
    // a (public)
    // b (protected)
    // c 不可访问
};
protected继承:
  • 基类的public成员变为protected
  • 基类的protected成员仍为protected
  • 基类的private成员不可访问。
class Derived : protected Base {
    // a (protected)
    // b (protected)
    // c 不可访问
};
private继承:
  • 基类的publicprotected成员都变为private
  • 基类的private成员不可访问。
class Derived : private Base {
    // a (private)
    // b (private)
    // c 不可访问
};
继承方式基类的public成员基类的protected成员基类的private成员
publicpublicprotected不可访问
protectedprotectedprotected不可访问
privateprivateprivate不可访问

3. 总结

  • 成员访问权限修饰符
    控制类内、派生类和外部对成员的访问权限。
  • 继承方式
    决定基类的访问权限如何在派生类中呈现。
  • 注意点
    • 无论继承方式如何,基类的private成员永远不会直接出现在派生类中。
    • 可以通过基类的publicprotected接口间接访问private成员。

希望以上内容能帮助你理解C++中访问权限和继承的区别与关系!如果需要具体代码示例,可以告诉我。


http://www.kler.cn/a/411537.html

相关文章:

  • Opencv+ROS实现颜色识别应用
  • 华为OD机试真题---智能驾驶
  • Qt中2D绘制系统
  • 游戏引擎学习第22天
  • TSmaster CAN/CANFD 诊断(Diagnostic_CAN)
  • 使用脚本实现hadoop-yarn-flink自动化部署
  • 计算机操作系统——进程控制(Linux)
  • 第八篇:CamX RawHdr Feature Enable
  • org.apache.log4j的日志记录级别和基础使用Demo
  • 【kafka01】消息队列与微服务之Kafka详解
  • 数据库(总结自小林coding)|索引失效的场景、慢查询、原因及如何优化?undo log、redo log、binlog 作用、MySQL和Redis的区别
  • 阿里云私服地址
  • SpringBoot(四十)SpringBoot集成RabbitMQ使用过期时间+死信队列实现延迟队列
  • 林业产品推荐系统:Spring Boot架构设计
  • K8s的水平自动扩容和缩容HPA
  • C#中面试的常见问题006
  • 使用mingw+CMake在Windows平台编译OpenCV
  • 政安晨【零基础玩转各类开源AI项目】探索Cursor-AI Coder的应用实例
  • element-plus动态判断表单是否是必填项。出错时显示的错误。在不是必填项时为什么还能显示
  • flink学习(8)——窗口函数
  • Diffusion异常检测相关论文及代码整理
  • MySQL底层概述—3.InnoDB线程模型
  • godot游戏引擎_瓦片集和瓦片地图介绍
  • Python开源项目月排行 2024年10月
  • thinkphp日志记录到文件
  • 【大数据学习 | Spark-Core】RDD的五大特性(包含宽窄依赖)