导图社区 第十三章类继承
C 自学笔记 第十三章类继承,分享的内容有: 一、 一个简单的基类 二、 继承:is-a关系 三、 多态公有继承 四、 静态联编和动态联编 五、 访问控制:protected 六、 抽象基类ABC (abstract base class) 七、 继承和动态内存分配 八、 类设计回顾
药理学 第十章肾上腺素受体激动药 主要药物的机理、作用,希望这份脑图对你有帮助。
药理学 第九章胆碱受体阻断药——N胆碱受体阻断药 主要药物的机理、作用,希望这份脑图对你有帮助。
药理学 第八章胆碱受体阻断药——M胆碱受体阻断药 主要药物的机理、作用,希望这份脑图对你有帮助。
社区模板帮助中心,点此进入>>
互联网9大思维
组织架构-单商户商城webAPP 思维导图。
域控上线
python思维导图
css
CSS
计算机操作系统思维导图
计算机组成原理
IMX6UL(A7)
考试学情分析系统
第十三章 类继承
一、 一个简单的基类
1. 创建一个简单基类
使用列表初始化可以节省步骤
string类对象有两个不同的构造函数
const char* 为参数
const string&为参数
2. 派生出一个类
1. 派生类
1. 特点
1. 派生类存储了基类的数据成员(派生类继承了基类的实现)
2. 派生类对象可以使用基类的方法(派生类继承了基类的接口)
2. 性质
1. 派生类需要构造自己的构造函数
2. 派生类可按需求添加额外的数据成员和成员函数
3.
4. 构造函数
构造函数必须给新成员和继承的成员提供数据
3. 构造函数:访问权限的考虑
1. 构造函数
派生类不能直接访问基类的 私有成员,必须通过基类方法进行访问
也就是说,派生类的构造函数必须使用基类的构造函数
《——
因为在创建派生类对象时,首先创建基类对象
构造函数嵌套
应提起注意,如果没有显示地给基类成员赋值,那么编译器将自动使用默认的构造函数为基类对象赋值
2. 构造函数的要点
1. 首先创建基类对象
2. 派生类构造函数应通过成员初始化列表将基类信息传递给基类构造函数
3. 派生类构造函数应该初始化派生类新增的数据成员
3. 基类构造函数负责初始化继承的数据成员,派生类构造函数负责初始化新增的数据成员
派生类过期时
首先调用派生类析构函数
再调用基类析构函数
4.
4. 使用派生类
5. 派生类和基类之间的关系
1. 注意
派生类可以使用基类的方法,但不能访问私有成员
基类的指针或引用只能调用基类方法,不能用于调用派生类方法
2. 指针
1. 基类指针可以在不进行显示转换的情况下指向派生类对象
2. 基类引用可以在不进行显示类型转换的情况下引用派生类对象
3. 注意
1. 可以隐式使用基类的复制构造函数
TableTennisPlayer(const TableTennisPlayer & )
这样可以使用基类引用指向派生类来初始化基类对象
即基类是嵌套在派生类中的
2. 可以隐式使用基类的赋值运算符
TableTennisPlayer& operator=(const TableTennisPLayer & )const;
二、 继承:is-a关系
三、 多态公有继承
希望同一个方法在基类和派生类中的行为是不同的
即方法的行为取决于对象
机制(不同的解决办法)
在派生类中重新定义基类的方法
使用虚方法virtual
2. 注意
如果没有使用关键字virtual
将根据引用类型和指针的类型 选择方法
使用了关键字virtual
将根据引用或指针指向的对象的类型 选择方法
3. 类实现
基类方法
1.
2.
派生类方法
4. 类使用
当使用基类指针和基类引用时,可指向派生类,此时可创建基类指针数组,来同时指向基类和派生类,并且可以使用虚方法,所以利用虚函数可以实现同一方法在不同类中的不同的行为
5. 为何需要析构函数
虚析构函数能保证正确的析构函数被调用
四、 静态联编和动态联编
1. 种类
静态联编/早起联编
动态联编/晚期联编
2. 指针和引用类型的兼容性
向上强制转换
定义
将派生类引用或指针转化为基类引用或指针
即将派生类对象的引用或指针传递给参数为基类引用或指针的函数
作用
这使公有继承不需要进行显示类型转换
举例
对Brass执行的操作同样适用于BrassPlus
向下强制转换
将基类指针或引用转换为派生类指针或引用
即将基类对象的引用或指针传递给参数为派生类引用或指针的函数
不允许的
通常 is-a 关系不可逆
因此使用向上强制转换需要动态联编
3. 虚成员函数和动态联编
1. 静态联编
效率高且不需要重新定义函数
2. 虚函数工作原理
虚函数表
存储了类对象进行声明的虚函数的地址
成本
每个对象都有,所需存储空间znegda
每个类都需要创建一个虚函数地址表
在执行虚函数时,都需要在表中查找虚函数的地址
4. 有关虚函数的注意事项
1. 要点
1. 基类方法声明中使用virtual关键字,并且在派生类中也添加virtual关键字来表明该函数是一个虚函数
2. 使用指向对象的指针或对象来调用虚方法,请注意将根据指向的类对象的种类来调用不同虚函数
3. 应将在派生类中重新定义的类方法重新声明为虚函数
2. 构造函数
声明为虚函数没必要
3. 析构函数
应声明为虚函数,使之能正确调用
4. 友元函数
不能声明为虚函数,因为友元函数不是成员函数
5. 重新定义将隐藏原方法
虚方法不同于函数重载,不会生成俩个不同的函数版本,而是会覆盖原有函数,无论函数标是否相同
6. 经验规则
1. 如果重新定义继承的方法,应确保函数特征标与原来的原型完全相同,但返回的类型可以修改
2. 若基类声明为重载,则应在派生类中重新声明并定义所有基类版本
五、 访问控制:protected
1. 定义
访问控制protected中的成员能被访问,派生类成员可直接访问
六、 抽象基类ABC (abstract base class)
为了解决不同派生类之间的共性的问题,提出他们共性的部分而保留异性部分,同时节约空间
2. 纯虚函数
当类声明中包含纯虚函数时,则不能创建该类的对象
只能作为基类
称为抽象类
在原型中= 0来指出这是一个纯虚函数
需要时再定义,节约内存
3. 应用ABC的概念
基类
Brass类
BrassPlus类
4. ABC理念
1. 开发出一个模型
提出编程问题所需要的类以及他们之间的相互关系
2. ABC要求具体派生类覆盖其纯虚函数——迫使派生类遵循ABC设置的接口规则
七、 继承和动态内存分配
1. 性质
怎样动态使用内存分配(在前面已经涉及到类的复制构造函数和赋值运算符对于类在传递过程中出现的问题,在这里衍生到派生类和基类的动态分配内存)
2. 分类
第一种情况
派生类不使用new
不需要重新显示定义析构函数、复制构造函数和赋值运算符
派生类的默认的复制构造函数将按值传递,并且只会复制派生类中的成员,然后同时调用基类已经定义好的复制构造函数,将不会影响派生类的复制
第二种情况
派生类使用new
1. 必须重新显示定义析构函数、复制构造函数和赋值运算符
2. 析构函数
派生类析构函数将自动调用基类的析构函数,但是基类的析构函数将不会自动释放派生类指针数据成员指向的内存,因此派生类的析构函数应该释放派生类指针数据成员指向的内存
3. 复制构造函数
在复制基类时,注意基类的引用可以指向派生类,故可以使用派生类来初始化嵌套在派生类中的基类
4. 赋值运算符
使用函数表示法来调用基类中重新定义的赋值运算符
3. 全部代码
头文件
八、 类设计回顾