封装、继承、多态是层进依赖关系:封装确立访问边界,是继承的前提;继承建立is-a关系,是多态的结构基础;多态则激活运行时动态绑定,三者协同实现变更隔离。

封装、继承、多态不是并列的三个独立特性,而是有明确依赖顺序的层进关系:没有封装,就没有可靠的继承;没有继承,多态就失去落地基础。
封装是所有OOP行为的前提
类必须先通过 private / protected / public 明确划定访问边界,才能谈“继承什么”“暴露什么”。如果数据成员直接设为 public,派生类就能随意修改基类状态,导致不变量被破坏——此时所谓“继承”只是字段复制,不是语义复用。
- 基类的
private成员虽被继承,但派生类无法访问,只能靠基类public或protected接口间接操作 -
struct默认public成员,适合纯数据聚合;class默认private,才是封装的常规载体 - 构造函数、析构函数、友元函数不被继承,意味着封装逻辑(如资源初始化/清理)必须由每个类自己显式定义
继承是多态的必要结构支撑
多态的核心机制——虚函数调用——依赖基类指针或引用指向派生类对象。这个“指向”能成立,前提是派生类和基类之间存在明确的 is-a 关系,而该关系由继承语法(: public Base)静态确立。
- 只有被声明为
virtual的函数才进入虚函数表;非虚函数调用在编译期绑定,与继承体系无关 - 私有继承(
: private Base)或保护继承(: protected Base)会使基类接口对外不可见,导致无法用基类指针持有派生类对象,多态失效 - 菱形继承中若未用
virtual修饰继承路径,会导致二义性和虚表错位,运行时多态行为不可预测
多态是封装+继承的运行时价值兑现
封装保证了接口稳定,继承建立了类型层次,而多态让这套结构真正活起来:同一段代码(如 base_ptr->draw())在运行时根据实际对象类型,自动调用对应实现。它不新增语法,只激活已有结构的动态能力。
立即学习“C++免费学习笔记(深入)”;
- 虚函数必须在基类中声明,在派生类中
override,否则编译器不识别为多态重写 - 基类析构函数若非
virtual,用基类指针delete派生类对象会导致派生部分内存泄漏——这是封装边界 + 继承关系 + 多态销毁三者协同失败的典型表现 - 纯虚函数(
= 0)强制派生类实现,把“接口契约”从文档约定升级为编译约束,是封装意图 + 继承义务 + 多态强制的三位一体
最容易被忽略的是:三者共同服务于“变更隔离”。比如修改某个派生类的 process() 实现,只要不破坏基类接口契约(封装)、不改变继承关系(继承)、不改动虚函数签名(多态),上层调用完全无需感知——这种稳定性不是某一个特性单独提供的,而是三层咬合的结果。


















