跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++

C++ 继承机制详解

继承的概念 继承(Inheritance)是面向对象程序设计中实现代码复用的核心机制。它允许在保持原有类特性的基础上进行扩展,增加新的成员函数和成员变量,由此产生的新类称为**派生类**(Derived Class),原有类称为**基类**(Base Class)。 若不采用继承机制,设计具有相似属性的类时会导致代码冗余。例如 Student 和 Teacher 类都包含姓名、地址、年龄、电话等成…

雾岛听风发布于 2026/3/30更新于 2026/7/834K 浏览
C++ 继承机制详解

1. 继承的概念

继承(Inheritance)是面向对象程序设计中实现代码复用的核心机制。它允许在保持原有类特性的基础上进行扩展,增加新的成员函数和成员变量,由此产生的新类称为派生类(Derived Class),原有类称为基类(Base Class)。

若不采用继承机制,设计具有相似属性的类时会导致代码冗余。例如 Student 和 Teacher 类都包含姓名、地址、年龄、电话等成员变量,以及身份认证函数 identity():

class Student {
public:
    void identity() { /* 身份认证 */ }
    void study() { /* 学习 */ }
protected:
    string _name = "peter";
    string _address;
    string _tel;
    int _age = 18;
    int _stuid;
};

class Teacher {
public:
    void identity() { /* 身份认证 */ }
    void teaching() { /* 授课 */ }
protected:
    string _name = "张三";
    int _age = 18;
    string _address;
    string _tel;
    string _title;
};

通过引入公共基类 Person,让 Student 和 Teacher 继承 Person,即可复用公共成员,消除冗余:

class Person {
public:
    void identity() { cout << "void identity() " << _name << endl; }
protected:
    string _name = "张三";
    string _address;
    string _tel;
    int _age = 18;
};

class Student : public Person {
public:
    void study() { /* ... */ }
protected:
    int _stuid;
};

class Teacher : public Person {
public:
    void teaching() { /* ... */ }
protected:
    string title;
};

int main() {
    Student s;
    Teacher t;
    s.identity();
    t.identity();
    return 0;
}

2. 继承的定义

2.1 定义格式

基类(Base Class)也称父类,派生类(Derived Class)也称子类。继承的语法格式如下:

继承关系示意图1

继承关系示意图2

2.2 基类成员访问方式的变化

继承方式决定了基类成员在派生类中的访问权限。具体变化如下表所示:

基类成员 / 继承方式public 继承protected 继承private 继承
public 成员派生类的 public 成员派生类的 protected 成员派生类的 private 成员
protected 成员派生类的 protected 成员派生类的 protected 成员派生类的 private 成员
private 成员在派生类中不可见在派生类中不可见在派生类中不可见

核心规则总结:

  • 基类的 private 成员无论以何种方式继承,在派生类中均不可见。这里的'不可见'是指语法上限制派生类(无论在类内还是类外)直接访问它,但该成员仍会被继承到派生类对象中。
  • 若基类成员不希望被类外直接访问,但需要在派生类中访问,应将其定义为 protected。保护成员限定符正是为继承机制而设计的。
  • 派生类成员的最终访问权限遵循取小原则:派生类访问权限 = min(基类成员访问权限, 继承方式)(权限等级:public > protected > private)。
  • 使用 class 关键字时默认继承方式为 private,使用 struct 时默认为 public。为提高代码可读性,建议始终显式指定继承方式。
  • 实际开发中绝大多数情况使用 public 继承。protected 和 private 继承会限制成员的访问范围,降低代码的扩展性与可维护性,通常不推荐使用。

3. 继承模板

当基类为类模板时,派生类在调用基类成员函数时需要显式指定类域,否则可能因模板的'按需实例化'特性导致编译错误。

namespace jiang {
    template <class T>
    class stack : public std::vector<T> {
    public:
        void push(const T& x) {
            // 基类是类模板时,必须指定类域,否则编译报错
            // 因为 stack<int> 实例化时也会实例化 vector<int>
            // 但模板按需实例化,push_back 等成员函数此时未实例化,直接调用会找不到标识符
            vector<T>::push_back(x);
        }
        void pop() { vector<T>::pop_back(); }
        const T& top() { return vector<T>::back(); }
        bool empty() { return vector<T>::empty(); }
    };
}

int main() {
    jiang::stack<int> st;
    st.push(1);
    st.push(2);
    st.push(3);
    while (!st.empty()) {
        cout << st.top() << " ";
        st.pop();
    }
    return 0;
}

4. 基类与派生类对象之间的转换

  • 派生类对象赋值给基类指针/引用:public 继承的派生类对象可以隐式转换为基类的指针或引用。这一过程形象地称为**切片(Slicing)**或切割,即只提取派生类中属于基类的那部分数据,基类指针或引用指向该部分。
  • 基类对象赋值给派生类对象:不允许隐式转换,编译器会直接报错。
  • 基类指针/引用转换为派生类指针/引用:可以通过强制类型转换实现,但仅当基类指针实际指向派生类对象时才是安全的。若基类为多态类型,推荐使用 RTTI(Run-Time Type Information)中的 dynamic_cast 进行安全的向下转换。

类型转换示意图

class Person {
protected:
    string _name;
    string _sex;
    int _age;
};

class Student : public Person {
public:
    int _No;
};

int main() {
    Student sobj;
    
    // 1. 派生类对象可以赋值给基类的指针/引用
    Person* pp = &sobj;
    Person& rp = sobj;
    
    // 派生类对象赋值给基类对象时,会调用基类的拷贝构造函数完成切片
    Person pobj = sobj;
    
    // 2. 基类对象不能赋值给派生类对象(编译报错)
    // sobj = pobj;
    
    return 0;
}

目录

  1. 1. 继承的概念
  2. 2. 继承的定义
  3. 2.1 定义格式
  4. 2.2 基类成员访问方式的变化
  5. 3. 继承模板
  6. 4. 基类与派生类对象之间的转换
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 2025 年人工智能发展趋势与学习路径指南
  • C++ 链接错误 undefined reference 原因分析与解决方案
  • C++ 基于正倒排索引的 Boost 搜索引擎:日志宏与 Server 主程序详解
  • 大模型幻觉纠正与知识蒸馏新进展:HalluEditBench 与 SIKeD 研究解读
  • Linux 多线程核心:资源划分与控制实战指南
  • OpenClaw 配置飞书机器人完整指南
  • Windows 环境下 Git 安装与配置指南
  • PyWebIO 实现精准弹窗交互的关键点
  • 数据结构初阶:二叉树的链式存储结构详解
  • Java Map 常用方法与实现类深度详解
  • Java 动态代理核心原理与实战对比
  • C++ 类与对象:面向对象编程入门
  • GitHub Copilot 代理配置与网络优化实战指南
  • Android 开发中 OOM 问题的常见原因与解决方案
  • 从多库并存到一库多能:金仓数据库融合架构实践
  • 利用统一 API 接口实现大模型选型与成本优化
  • 分布式文件系统 HDFS 存储原理详解
  • 创业公司追逐 AGI 愿景:真的必要吗?
  • 鸿蒙金融理财全栈项目安全合规与用户体验优化
  • 法律领域自然语言处理(NLP)应用与实战

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online