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; }
};
相关推荐
yi.Ist2 小时前
图论——Floyd算法
c++·算法·图论·floyd
CodeCraft Studio8 小时前
3D文档控件Aspose.3D实用教程:使用 C# 构建 OBJ 到 U3D 转换器
开发语言·3d·c#·3d渲染·aspose·3d文件格式转换·3d sdk
superlls8 小时前
(Redis)主从哨兵模式与集群模式
java·开发语言·redis
让我们一起加油好吗8 小时前
【基础算法】初识搜索:递归型枚举与回溯剪枝
c++·算法·剪枝·回溯·洛谷·搜索
郝学胜-神的一滴8 小时前
Horse3D游戏引擎研发笔记(七):在QtOpenGL环境下,使用改进的Uniform变量管理方式绘制多彩四边形
c++·3d·unity·游戏引擎·图形渲染·虚幻·unreal engine
chenglin0169 小时前
C#_gRPC
开发语言·c#
骑驴看星星a9 小时前
数学建模--Topsis(Python)
开发语言·python·学习·数学建模
2401_8762213410 小时前
Reachability Query(Union-Find)
c++·算法
tju新生代魔迷11 小时前
C语言宏的实现作业
c语言·开发语言
yueyuebaobaoxinx12 小时前
MATLAB 与 Simulink 联合仿真:控制系统建模与动态性能优化
开发语言·matlab·性能优化