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; }
};
相关推荐
love_muming6 分钟前
Java编程核心技巧全解析
java·开发语言·idea
wjm04100611 分钟前
简单谈谈ios开发中的UI
开发语言·ios·swift
slandarer16 分钟前
MATLAB | 土地利用变化桑基图及状态转移桑基图绘制
开发语言·数学建模·matlab·桑基图
BestOrNothing_201523 分钟前
C++零基础到工程实战(5.2.4):指针与引用在函数传参、返回值与效率优化中的应用
c++·指针·引用·const·函数参数
L_090726 分钟前
【C++】面向对象三大特性之多态
开发语言·c++
threelab28 分钟前
Three.js 银河星系效果 | 三维可视化 / AI 提示词
开发语言·javascript·人工智能
程序员敲代码吗29 分钟前
探索JavaScript对象创建的灵活方式
开发语言·javascript·ecmascript
FlyWIHTSKY32 分钟前
Next.js中客户端组件和服务端组件
开发语言·javascript·ecmascript
天若有情67332 分钟前
轻量级状态事件总线 eventbusx-js 开源使用教程
开发语言·javascript·npm·开源·事件·事件总线
XMYX-035 分钟前
36 - Go exec 执行命令
开发语言·golang