1.继承与友元核心结论友元关系不能被继承1.什么是友元友元是一种授权机制允许外部函数 / 外部类访问一个类的 private/protected 成员。友元关系是单向、不可传递、不可继承的。2.友元关系不继承基类的友元 ≠ 派生类的友元友元只能访问当前声明它的类的成员无法自动访问子类成员继承不会传递友元权限3.友元函数 继承#include iostream using namespace std; // 基类 class Person { private: string name 张三; // 声明友元函数 friend void show(Person p); }; // 基类的友元函数 void show(Person p) { cout 访问基类私有成员 p.name endl; // ✅ 合法 } // 派生类 class Student : public Person { private: // 派生类独有私有成员 int id 1001; }; int main() { Student s; show(s); // ✅ 可以调用向上转型但只能访问基类成员 // show函数 无法访问 s.id ❌ 因为友元没有被继承 return 0; }友元函数 show 只能访问基类 Person 的成员不能访问派生类 Student 的私有成员 id。4.友元类 继承#include iostream using namespace std; class Student; // 提前声明 // 基类 class Person { private: string name 李四; // 声明 Teacher 为友元类 friend class Teacher; }; // 派生类 class Student : public Person { private: int id 1002; // 子类私有成员 }; // 基类的友元类 class Teacher { public: void visit(Person p, Student s) { cout 访问基类 p.name endl; // ✅ 合法 // 访问派生类私有成员 id ❌ 报错友元不继承 // cout 访问子类 s.id endl; } };友元类 Teacher 可以访问基类 Person无权访问派生类 Student 的独有成员。2.复杂的菱形继承及菱形虚拟继承1.什么是菱形继承四个类形成菱形的继承关系多继承的特殊情况1.一个顶级基类公共父类2.两个中间派生类同时继承这个顶级基类3.一个最终派生类同时继承这两个中间类2. 经典菱形结构图示3.普通菱形继承的致命问题#include iostream using namespace std; // 顶级基类 class Person { public: int m_age; // 年龄 }; // 中间类1老师 class Teacher : public Person { public: int m_teach_id; }; // 中间类2学生 class Student : public Person { public: int m_stu_id; }; // 最终类助教多继承 class Assistant : public Teacher, public Student {};int main() { Assistant ass; // 1. 赋值报错二义性编译器不知道用哪个Person的m_age // ass.m_age 18; // 2. 数据冗余Assistant对象里有**两份** m_age ass.Teacher::m_age 18; ass.Student::m_age 20; return 0; }二义性访问顶级基类成员时编译器分不清是哪个父类的成员数据冗余最终对象会存储多份顶级基类的成员浪费内存4.解决方案菱形虚拟继承核心作用让最终派生类只保留一份顶级基类的成员彻底解决二义性 数据冗余。语法在中间派生类继承时加上关键字 virtualclass 中间类 : virtual public 顶级基类 {};菱形虚拟继承代码正确版#include iostream using namespace std; // 顶级基类 class Person { public: int m_age; }; // 虚拟继承中间类加 virtual class Teacher : virtual public Person { public: int m_teach_id; }; // 虚拟继承中间类加 virtual class Student : virtual public Person { public: int m_stu_id; }; // 最终类多继承 class Assistant : public Teacher, public Student {}; int main() { Assistant ass; ass.m_age 18; // ✅ 正常只有一份m_age无歧义 cout ass.m_age endl; // 输出 18 return 0; }无二义性直接访问 m_age 不报错无数据冗余Assistant 只存一份 Person 成员谢谢