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

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.xdnf.cn/news/8631.html

相关文章:

  • 【算法】:动态规划--背包问题
  • Linux常用下载资源命令
  • OpenLayers 加载导航与基本操作控件
  • AD9268、AD9643调试过程中遇到的问题
  • Linux的读写屏障
  • Mysql 通过案例快速学习常见操作
  • 索引下探(Index Condition Pushdown,简称ICP)
  • 大模型介绍
  • 动态规划dp
  • Java中==和equals()的终极对比
  • SpikingYOLOX
  • GATT 服务的核心函数bt_gatt_discover的介绍
  • Day 34
  • Docker 镜像标签(Tag)规范与要求
  • 历史数据分析——宁波港
  • 防火墙流量管理-带宽管理
  • OpenLayers 加载图层探查控件
  • Linux系统移植①:uboot概念
  • 基于规则匹配实现企业政策精准匹配实战案例
  • 《Java vs Go:现代编程语言的核心差异与设计哲学对比》
  • nginx 基于IP和用户的访问
  • LangGraph的智能评估
  • 【深度学习新浪潮】什么是MCP?
  • LangGraph:部署智能应用
  • 地理特征类相关可视化图像总结
  • stream数据流
  • 电子电路:再谈滤波原理及其应用
  • 再谈Linux 进程:进程等待、进程替换与环境变量
  • [Solution] git push error (exit code 128)
  • linux 内存碎片分析