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; }
};
相关推荐
知然14 小时前
鸿蒙 Native API 的封装库 h2lib_arkbinder
c++·arkts·鸿蒙
粟悟饭&龟波功14 小时前
Java—— ArrayList 和 LinkedList 详解
java·开发语言
冷雨夜中漫步14 小时前
Java中如何使用lambda表达式分类groupby
java·开发语言·windows·llama
十五年专注C++开发14 小时前
Qt .pro配置gcc相关命令(三):-W1、-L、-rpath和-rpath-link
linux·运维·c++·qt·cmake·跨平台编译
a45763687614 小时前
Objective-c Block 面试题
开发语言·macos·objective-c
Cai junhao15 小时前
【Qt】Qt控件
开发语言·c++·笔记·qt
uyeonashi15 小时前
【QT系统相关】QT网络
开发语言·网络·c++·qt
程序猿小D15 小时前
第27节 Node.js Buffer
linux·开发语言·vscode·node.js·c#·编辑器·vim
武昌库里写JAVA16 小时前
【微服务】134:SpringCloud
java·开发语言·spring boot·学习·课程设计
yaoxin52112316 小时前
105. Java 继承 - 静态方法的隐藏
java·开发语言·jvm