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; }
};
相关推荐
星释13 小时前
Rust 练习册 75:ETL与数据转换
开发语言·rust·etl
happyjoey21713 小时前
使用Qt自带的Maintenance Tool将Qt6.9升级为QT6.10
开发语言·qt
p***h64317 小时前
JavaScript在Node.js中的异步编程
开发语言·javascript·node.js
散峰而望17 小时前
C++数组(二)(算法竞赛)
开发语言·c++·算法·github
Porunarufu17 小时前
Java·关于List
java·开发语言
子不语18017 小时前
Python——函数
开发语言·python
利刃大大18 小时前
【动态规划:背包问题】完全平方数
c++·算法·动态规划·背包问题·完全背包
ndjnddjxn18 小时前
Rust学习
开发语言·学习·rust
月光技术杂谈18 小时前
实战:C驱动框架嵌入Rust模块的互操作机制与完整流程
c语言·开发语言·rust·ffi·跨语言·bindgen·互操作
t1987512818 小时前
基于MATLAB的指纹识别系统完整实现
开发语言·matlab