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

目录

[1. 什么是继承?](#1. 什么是继承?)

[2. 继承的访问控制](#2. 继承的访问控制)

[3. 派生类构造与析构](#3. 派生类构造与析构)

[(1) 构造顺序](#(1) 构造顺序)

[(2) 析构顺序](#(2) 析构顺序)

[4. 函数隐藏(Name Hiding)](#4. 函数隐藏(Name Hiding))


1. 什么是继承?

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

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

2. 继承的访问控制

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

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

示例:

cpp 复制代码
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. 基类析构函数

示例:

cpp 复制代码
#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)

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

示例:

cpp 复制代码
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;
}

解决方法:

cpp 复制代码
class Derived : public Base {
public:
    using Base::show; // 引入基类的 show()
    void show(int x) { cout << "Derived::show(int)" << endl; }
};
相关推荐
AI_RSER11 分钟前
第一篇:【Python-geemap教程(三)上】3D地形渲染与Landsat NDVI计算
开发语言·python·3d·信息可视化·遥感·gee
WSSWWWSSW34 分钟前
Python编程基础与实践:Python循环结构基础
开发语言·python
极客BIM工作室36 分钟前
深入理解C++中的Lazy Evaluation:延迟计算的艺术
开发语言·c++
im_AMBER1 小时前
学习日志25 python
开发语言·python·学习
南棱笑笑生1 小时前
20250802让飞凌OK3576-C开发板在飞凌的Android14下【rk3576_u选项】适配NXP的WIFIBT模块88W8987A的蓝牙
c语言·开发语言
吉凶以情迁2 小时前
window服务相关问题探索 go语言服务开发探索调试
linux·服务器·开发语言·网络·golang
22:30Plane-Moon2 小时前
Servlet作用域,监听器,JSP九大内置对象
java·开发语言·servlet
小指纹2 小时前
图论-最短路Dijkstra算法
数据结构·c++·算法·深度优先·图论
小白(猿)员2 小时前
JVM、JDK、JRE的区别
java·开发语言·jvm
Evand J3 小时前
【matlab例程】无迹粒子滤波(UPF)的例程,用于三维环境下多雷达目标跟踪,非线性系统
开发语言·matlab·目标跟踪