第六章 继承与派生 C++核心知识点
一、基础概念
1. 继承(派生):在已有类(基类/父类)基础上建立新类(派生类/子类),复用原有代码,实现代码复用。
2. 基类:被继承的类;派生类:继承得到的新类。
3. 格式
cpp
class 派生类名 : 继承方式 基类名
{
新增成员;
};
4. 三种继承方式: public 、 protected 、 private
访问权限变化(重点)
基类成员 public继承 protected继承 private继承
public public protected private
protected protected protected private
private 不可直接访问 不可直接访问 不可直接访问
关键点:基类私有成员,无论何种继承,派生类都不能直接访问,只能调用基类公有、保护成员函数访问。
二、三种继承详细说明
1. public 公有继承(最常用)
- 基类public→派生类public,基类protected→派生类protected
- 外部只能访问继承来的public成员,protected仅类内、子类可用。
2. protected 保护继承
‑ 继承之后原公有、保护成员全部变成派生类的protected。外部对象无法访问。
3. private 私有继承
‑ 继承后全部变为private,再次派生时,下一级子类无法继承到这些成员。
默认继承方式:class默认private继承;struct默认public继承。
三、派生类的构造函数与析构函数
1. 构造函数
派生类构造函数不会自动调用基类构造函数,必须显式初始化。
语法:
cpp
派生类(参数列表):基类(实参),成员对象(实参)
{
}
- 执行顺序:先基类构造 → 成员对象构造 → 派生类自身构造
- 如果不写基类调用,自动调用基类无参构造。基类只有带参构造时,派生类必须显式传参。
2. 析构函数
- 析构不能显式调用父类析构,系统自动执行
- 执行顺序:派生类析构 → 成员对象析构 → 基类析构,和构造顺序相反
四、同名成员隐藏(覆盖)
1. 派生类和基类成员重名,派生类成员会隐藏基类同名成员。
2. 子类内访问子类成员;想要访问被隐藏的基类成员,要加作用域:
cpp
对象.基类::成员;
3. 函数同名:普通同名隐藏,不属于多态,没有虚函数时只发生静态覆盖。
五、访问基类私有成员方式
1. 基类提供public/protected的get、set成员函数,子类调用。
2. 友元:友元不能被继承。
六、多重继承
1. 一个派生类同时继承多个基类,逗号隔开。
cpp
class D:public A,public B
{};
2. 构造顺序:按照继承列表从左到右依次构造基类,跟初始化列表顺序无关。
3. 二义性问题:多个父类含有同名成员,直接调用会报错,必须加类名限定。
七、菱形继承(冗余数据、二义性)
1. 问题:公共祖先被重复继承,产生多份副本,占用内存并且访问产生歧义。
2. 解决方案:虚继承 virtual public
cpp
class B:virtual public A{};
class C:virtual public A{};
class D:public B,public C{};
虚继承只会保留一份A的数据,解决数据冗余。
八、protected 访问属性的意义
1. public成员:外界可以随意修改,不安全。
2. private成员:子类无法直接使用,不方便扩展。
3. protected:类内部以及派生类可以直接使用,外部禁止访问,专门服务于继承。
九、重要易错点总结
1. 继承只会继承成员变量和成员函数,构造、析构、运算符重载、友元不能被继承。
2. 继承方式只决定子类向外暴露的权限,子类内部永远可以访问基类public、protected。
3. 私有继承之后,后续再派生,上一层继承来的数据无法继续向下传递。
4. 派生类新增成员,只能在派生类函数里使用,基类无法访问子类独有的成员。
更多推荐
所有评论(0)