我在C++中深入理解了继承,收获颇丰

继承与派生基础概念

继承允许从已有类(基类/父类)创建新类(派生类/子类),实现代码复用和层次化设计。子类自动获得基类成员(除构造函数、析构函数、赋值运算符重载和友元外),并可扩展新成员。

语法示例:

cpp 复制代码
class Derived : public Base { 
    // 新增成员
};

继承方式与权限控制

继承方式决定基类成员在子类中的访问权限:

  • 公有继承(public):基类public→子类public;基类protected→子类protected;基类private→不可访问
  • 保护继承(protected):基类public/protected→子类protected;基类private→不可访问
  • 私有继承(private):基类public/protected→子类private;基类private→不可访问

关键点:

基类private成员始终不可直接访问,但会被继承(占用内存)。公有继承最常用,保持基类权限结构不变。

内存布局

子类对象内存包含基类部分和新增成员:

cpp 复制代码
class Base { int a; };
class Derived : public Base { int b; };
// sizeof(Derived) = sizeof(Base) + sizeof(b)

构造与析构顺序

构造顺序:

  1. 虚基类(按声明顺序)
  2. 非虚基类(按继承声明顺序)
  3. 对象成员(按类内声明顺序)
  4. 子类自身构造

析构顺序:

与构造完全相反。

示例:

cpp 复制代码
class A { /*...*/ };
class B { /*...*/ };
class C : public A, public B { /*...*/ };
C c; // 输出:A构造 B构造 C构造 ~C ~B ~A

初始化列表规则

必须显式调用基类构造的情况:

基类无默认构造函数时,需在子类初始化列表中手动调用:

cpp 复制代码
class Base { 
public:
    Base(int x) { /*...*/ } 
};
class Derived : public Base {
public:
    Derived(int x, int y) : Base(x), b(y) {}
private:
    int b;
};

赋值兼容规则

公有继承下,子类对象可向上转换:

  1. 子类对象赋值给基类对象(发生切片,仅复制基类部分)
  2. 子类对象初始化基类引用(无拷贝,安全)
  3. 子类指针赋值给基类指针(存储子类首地址)

禁止反向操作:

基类对象不能自动转为子类(可能导致越界)。

代码示例:

cpp 复制代码
Base* ptr = new Derived();  // 允许
// Derived* d = new Base(); // 错误
相关推荐
咖啡八杯1 小时前
GoF设计模式——解释器模式
java·后端·spring·设计模式
GuWenyue1 小时前
传统Agent工具两大痛点!300行代码落地MCP跨语言工具,彻底解耦LLM与工具
前端·人工智能·算法
优橙教育1 小时前
5G网优培训 vs Java开发:转行选哪个?
java·开发语言·5g
糖果店的幽灵1 小时前
【DeepAgents 从入门到精通】Context Management 上下文管理
java·人工智能·后端·spring·中间件·langgraph·deepagents
同勉共进2 小时前
记一例 vibe coding + gcc bug 导致的线程池死锁问题
c++·线程池·gcc·死锁·vibe coding
我叫洋洋2 小时前
C ++ [ hello world ]
c语言·c++·算法
腻害兔3 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:字典、短信、邮件、通知——后台系统的“基础设施四件套“!
java·前端·vue.js·产品经理·ai编程
碎光拾影3 小时前
ARM交叉工具链各工具作用及IMX6ULL平台LED+蜂鸣器裸机程序实现
java·开发语言·数据库
奋发向前wcx3 小时前
y1,y2总复习笔记5 2026.7.19
数据结构·笔记·算法
Miao121314 小时前
微服务 API 测试实践:海外某民宿平台如何构建模式驱动测试基础设施
java·开发语言