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

C++ 继承详解:基础篇(含代码示例)

目录

1. 什么是继承?

2. 继承的访问控制

3. 派生类构造与析构

(1) 构造顺序

(2) 析构顺序

4. 函数隐藏(Name Hiding)


1. 什么是继承?

继承(Inheritance)是面向对象编程(OOP)的核心特性之一,它允许一个类(派生类/子类)继承另一个类(基类/父类)的成员(变量和函数),从而实现代码复用和层次化设计。

  • access-specifier 可以是 publicprotected 或 private,决定基类成员在派生类中的访问权限。

2. 继承的访问控制

C++ 支持三种继承方式:

继承方式基类 public 成员基类 protected 成员基类 private 成员
publicpublicprotected不可访问
protectedprotectedprotected不可访问
privateprivateprivate不可访问

示例:

class Base {
public:int x;
protected:int y;
private:int z;
};class PublicDerived : public Base {// x 是 public// y 是 protected// z 不可访问
};class ProtectedDerived : protected Base {// x 是 protected// y 是 protected// z 不可访问
};class PrivateDerived : private Base {// x 是 private// y 是 private// z 不可访问
};

3. 派生类构造与析构

(1) 构造顺序

  1. 基类构造函数(先构造父类)
  2. 派生类成员变量构造函数
  3. 派生类构造函数

(2) 析构顺序

  1. 派生类析构函数
  2. 派生类成员变量析构函数
  3. 基类析构函数

示例:

#include <iostream>
using namespace std;class Base {
public:Base() { cout << "Base 构造" << endl; }~Base() { cout << "Base 析构" << endl; }
};class Derived : public Base {
public:Derived() { cout << "Derived 构造" << endl; }~Derived() { cout << "Derived 析构" << endl; }
};int main() {Derived d;  // 输出:// Base 构造// Derived 构造// Derived 析构// Base 析构return 0;
}

4. 函数隐藏(Name Hiding)

如果派生类定义了与基类同名的函数(即使参数不同),基类的函数会被隐藏,除非显式调用。

示例:

class Base {
public:void show() { cout << "Base::show()" << endl; }
};class Derived : public Base {
public:void show(int x) { cout << "Derived::show(int)" << endl; }
};int main() {Derived d;d.show();       // ❌ 编译错误,基类 show() 被隐藏d.show(10);     // ✅ 输出 "Derived::show(int)"d.Base::show(); // ✅ 输出 "Base::show()"return 0;
}

解决方法:

class Derived : public Base {
public:using Base::show; // 引入基类的 show()void show(int x) { cout << "Derived::show(int)" << endl; }
};

http://www.lryc.cn/news/2385419.html

相关文章:

  • PP-YOLOE-SOD学习笔记2
  • OpenLayers 加载测量控件
  • .NET ORM开发手册:基于SqlSugar的高效数据访问全攻略
  • 【PostgreSQL】数据探查工具1.0研发可行性方案
  • C++ 内存管理与单例模式剖析
  • 算法学习——从零实现循环神经网络
  • win10使用nginx做简单负载均衡测试
  • 2025电工杯数学建模B题思路数模AI提示词工程
  • 软考软件评测师——软件工程之开发模型与方法
  • 前端表单中 `readOnly` 和 `disabled` 属性的区别
  • 【日志软件】hoo wintail 的替代
  • OceanBase数据库全面指南(基础入门篇)
  • 异步处理与事件驱动中的模型调用链设计
  • redis配置带验证的主从复制
  • Ollama-OCR:基于Ollama多模态大模型的端到端文档解析和处理
  • OpenCV CUDA 模块中图像过滤------创建一个拉普拉斯(Laplacian)滤波器函数createLaplacianFilter()
  • 图论学习笔记 3
  • 在单片机中如何在断电前将数据保存至DataFlash?
  • 【将WPS设置为默认打开方式】--突然无法用WPS打开文件
  • 电子人的分水岭-FPGA模电和数电
  • (6)python爬虫--selenium
  • Python之两个爬虫案例实战(澎湃新闻+网易每日简报):附源码+解释
  • HarmonyOS NEXT~鸿蒙系统与mPaaS三方框架集成指南
  • 系统安全及应用学习笔记
  • STC89C52RC/LE52RC
  • ✨ PLSQL卡顿优化
  • yum命令常用选项
  • python+vlisp实现对多段线范围内土方体积的计算
  • 鸿蒙Flutter实战:25-混合开发详解-5-跳转Flutter页面
  • APM32小系统键盘PCB原理图设计详解