C++ 笔记 赋值兼容原则(公有继承)(面向对象)
在 C公有继承public inheritance场景下赋值兼容原则是面向对象多态特性的基础规则也是实际开发中必须掌握的核心知识点。它定义了基类与公有派生类对象之间的赋值、转换规则且这些转换是自动、安全、隐式的无需强制类型转换。一、核心概念赋值兼容原则在公有继承中派生类对象可以当作基类对象使用基类的指针、引用可以指向、引用派生类对象。前提条件必须是公有继承私有继承、保护继承不满足该原则。本质公有继承表达is-a是一个关系派生类是基类的一种特例因此可以自动向上匹配基类。简单记公有继承下子类对象可以自动转换为父类对象。二、赋值兼容的四种典型用法重点我们先定义基类和公有派生类用于演示#include iostream using namespace std; // 基类 class Base { protected: int a; public: Base(int x) : a(x) {} void show() { cout Base: a a endl; } }; // 公有派生类 class Derived : public Base { private: int b; public: // 初始化基类 Derived(int x, int y) : Base(x), b(y) {} void show() { cout Derived: a a , b b endl; } };1. 派生类对象 赋值给 基类对象派生类对象可以直接给基类对象赋值只会赋值基类成员派生类独有成员会被截断。int main() { Derived d(10, 20); // 派生类对象 Base b d; // 合法派生类→基类自动转换 b.show(); // 调用基类方法输出Base: a 10 return 0; }2. 派生类对象 初始化 基类引用基类引用可以直接绑定派生类对象引用的是基类部分无截断、无拷贝。Derived d(10, 20); Base ref d; // 合法基类引用指向派生类对象 ref.show(); // 调用基类方法3. 基类指针 指向 派生类对象基类指针可以直接指向派生类对象这是多态的基础。Derived d(10, 20); Base* ptr d; // 合法基类指针指向派生类对象 ptr-show(); // 调用基类方法4. 派生类对象 作为函数参数基类类型函数形参为基类对象 / 指针 / 引用时可直接传入派生类对象这是赋值兼容原则最常用的场景。// 函数参数是基类引用 void print(Base obj) { obj.show(); } int main() { Derived d(30, 40); print(d); // 直接传入派生类对象自动转换 return 0; }三、核心规则总结只能向上转换派生类 → 基类自动、安全不能向下转换基类 → 派生类不允许隐式转换强行转换需用dynamic_cast且有风险仅公有继承有效private/protected 继承会破坏赋值兼容原则转换后只能访问基类成员指针 / 引用指向派生类对象后无法直接访问派生类独有成员错误示例基类指针访问派生类成员Derived d(10,20); Base* ptr d; ptr-b; // 错误基类没有b成员四、为什么必须是公有继承公有继承表达is-a是一个关系派生类完全包含基类的所有公有 / 保护成员外部可安全访问基类成员。私有 / 保护继承表达has-a有一个关系基类成员在派生类中变为私有 / 保护外部无法访问不满足自动转换的安全性。示例私有继承无法赋值兼容class Derived : private Base { ... }; Derived d; Base b d; // 错误私有继承不允许转换五、赋值兼容原则的意义代码复用一个函数可接收所有派生类对象无需为每个子类写单独函数。多态基础基类指针 / 引用指向派生类对象配合虚函数实现运行时多态。程序灵活新增派生类时基类接口无需修改符合开闭原则。六、易混点区分赋值兼容 ≠ 类型相等转换后只能用基类接口不能用派生类独有成员。向上转换安全向下转换危险向上派生类→基类自动安全向下基类→派生类必须强转不安全对象赋值会截断指针 / 引用不会截断对象赋值派生类独有成员丢失指针 / 引用仅指向基类部分对象本身无变化总结必背适用条件仅公有继承生效。核心规则派生类对象可自动转换为基类类型对象、指针、引用。四种用法派生类对象 → 基类对象派生类对象 → 基类引用派生类对象地址 → 基类指针派生类对象 → 基类类型函数参数核心价值是 C 多态的前提让代码更通用、更灵活。赋值兼容原则是理解 C 继承与多态的必经之路必须熟练掌握