继承是面向对象三大特性封装、继承、多态之一核心作用是代码复用 扩展功能让子类“继承”父类的属性和行为同时可以新增或修改自己的特性。一、继承基础语法1. 定义格式class子类名:继承方式 父类名{// 子类新增成员};2. 三种继承方式核心继承方式决定父类成员在子类中的访问权限优先级子类权限 继承方式限制。继承方式父类公有成员 → 子类父类保护成员 → 子类父类私有成员 → 子类公有继承公有保护不可访问保护继承保护保护不可访问私有继承私有私有不可访问继承规则总结继承方式简单记忆口诀公有继承不变public→public, protected→protected保护继承全变保护public/protected→protected私有继承全变私有public/protected→private✅ 最常用公有继承public —— 保留父类成员权限符合“is-a”逻辑子类是父类的一种。二、基础继承代码示例公有继承场景父类 Person 人类子类 Student 学生、 Teacher 教师#includeiostream#includestringusingnamespacestd;// 父类人类公共属性行为classPerson{public:// 父类公有成员子类可直接访问string name;intage;// 父类公有方法voideat(){coutname在吃饭endl;}voidsleep(){coutname在睡觉endl;}};// 子类1学生公有继承PersonclassStudent:publicPerson{public:// 子类新增成员intstu_id;// 学号string major;// 专业// 子类新增方法voidstudy(){coutname学号stu_id在学majorendl;}};// 子类2教师公有继承PersonclassTeacher:publicPerson{public:// 子类新增成员intteach_id;// 工号string course;// 授课科目// 子类新增方法voidteach(){coutname工号teach_id在教courseendl;}};intmain(){// 1. 创建子类对象直接使用父类成员Student stu;stu.name小明;// 继承父类public成员stu.age20;// 继承父类public成员stu.stu_id2024001;// 子类自有成员stu.major计算机科学;// 调用父类方法stu.eat();stu.sleep();// 调用子类方法stu.study();cout-------------------------endl;// 2. 创建教师对象Teacher tea;tea.name李老师;tea.age35;tea.teach_id1001;tea.courseC编程;tea.eat();tea.teach();return0;}运行结果plaintext小明在吃饭小明在睡觉小明学号2024001在学计算机科学李老师在吃饭李老师工号1001在教C编程三、继承中的成员访问protected关键字protected 是继承专属权限类内可访问类外不可访问子类可直接访问外部代码无法访问。代码示例protected成员继承#includeiostream#includestringusingnamespacestd;classPerson{protected:// 保护成员子类可访问外部不可访问string id_card;// 身份证号private:// 私有成员子类不可访问只能通过父类方法访问string password;public:string name;// 父类方法设置私有成员voidset_password(string pwd){passwordpwd;}};classStudent:publicPerson{public:voidset_id_card(string id){id_cardid;// 子类可直接访问父类protected成员}voidshow_info(){cout姓名name身份证id_cardendl;// cout password endl; 错误子类无法访问父类private成员}};intmain(){Student stu;stu.name小红;stu.set_id_card(3602032000xxxxxx);// 子类方法设置protected成员stu.show_info();// stu.id_card xxx; 错误外部无法访问protected成员return0;}四、继承中的构造与析构函数重点1. 调用顺序构造函数先调用父类构造 → 再调用子类构造析构函数先调用子类析构 → 再调用父类析构栈规则先进后出2. 子类调用父类有参构造必须初始化列表子类默认调用父类无参构造如果父类只有有参构造子类必须用初始化列表显式调用。#includeiostreamusingnamespacestd;classParent{public:intm_a;// 父类有参构造无默认无参构造Parent(inta){m_aa;cout父类有参构造m_aendl;}~Parent(){cout父类析构endl;}};classChild:publicParent{public:intm_b;// 子类构造必须用初始化列表调用父类有参构造Child(inta,intb):Parent(a){m_bb;cout子类有参构造m_bendl;}~Child(){cout子类析构endl;}};intmain(){Childc(10,20);return0;}运行结果plaintext父类有参构造10子类有参构造20子类析构父类析构五、继承中的同名成员处理隐藏子类和父类有同名成员时子类成员会隐藏父类同名成员访问父类成员需加 父类名:: 。代码示例#includeiostreamusingnamespacestd;classParent{public:intm_a100;// 父类成员voidfunc(){cout父类func()endl;}};classChild:publicParent{public:intm_a200;// 子类同名成员隐藏父类voidfunc(){cout子类func()endl;}};intmain(){Child c;// 访问子类成员cout子类m_ac.m_aendl;// 200c.func();// 子类func()// 访问父类同名成员加作用域cout父类m_ac.Parent::m_aendl;// 100c.Parent::func();// 父类func()return0;}六、多继承一个子类继承多个父类语法class子类:继承方式 父类1,继承方式 父类2{...};代码示例#includeiostreamusingnamespacestd;// 父类1外形classShape{public:string color红色;};// 父类2价格classPrice{public:intmoney100;};// 子类圆形多继承classCircle:publicShape,publicPrice{public:intr5;voidshow(){cout颜色color价格money半径rendl;}};intmain(){Circle c;c.show();return0;}⚠️ 多继承注意多个父类有同名成员时必须加 父类名:: 区分避免歧义。七、继承的核心作用总结代码复用父类写公共代码子类直接继承不用重复编写​功能扩展子类在父类基础上新增成员/方法不修改父类​多态基础继承是多态的前提父类指针指向子类对象。