Bootstrap

Week9-C++基础4(继承、多态、模板及类型转换的知识学习)

一、继承
1、引出
例如: 网页上有很多公共部分,如果按照一般的写法导致实现时候有很多重复的代码,因此引出继承的方法来简化代码量。
2、语法
class 子类 :继承方式 父类
3、继承方式
①公有继承
父类中的protected 在子类中是 protected
父类中的public 在子类中是 public
②保护继承
父类中的protected 在子类中是 protected
父类中的public 在子类中是 protected
③私有继承
父类中的protected 在子类中是 private
父类中的public 在子类中是 private
(注:不管公有继承 保护 还是私有 基类中的私有属性 ,都不可以继承下去)
4、继承中的对象模型
①子类会继承父类中所有的内容 ,包括了 私有属性
②只是我们访问不到,编译器给隐藏了
5、 继承中的构造和析构顺序
①子类创建对象时,先调用父类的构造,然后调用自身构造
② 析构顺序与构造顺序相反
③ 子类是不会继承父类的构造函数和析构函数
④ 补充内容,如果父类中没有合适默认构造,那么子类可以利用初始化列表的方式
二、多态(virtual):1.4.1 父类的引用或指针指向子类对象
1、原理:
当父类中有了虚函数后,内部结构就发生了改变,此时内部多了一个 vfprt
( virtual function pointer 虚函数表指针) 指向 vftable 虚函数表,父类中结构 vfptr指向&Animal::speak,在子类中 进行继承 时会继承 vfptr vftable(虚函数指针表), 构造函数中 会将虚函数表指针 指向自己的虚函数表, 如果发生了重写,会替换掉虚函数表中的原有的speak,改为 &Cat::speak
2、虚函数

虚函数 是在基类中使用关键字 virtual
声明的函数。在派生类中重新定义基类中定义的虚函数时,会告诉编译器不要静态链接到该函数。我们想要的是在程序中任意点可以根据所调用的对象类型来选择调用的函数,这种操作被称为动态链接,或后期绑定。

3、纯虚函数

您可能想要在基类中定义虚函数,以便在派生类中重新定义该函数更好地适用于对象,但是您在基类中又不能对虚函数给出有意义的实现,这个时候就会用到纯虚函数。

纯虚函数所在的类叫做抽象类,抽象类 不可以实例化对象,如果类 继承了抽象类, 必须重写抽象类中的纯虚函数
三、函数模板
1、函数模板基本使用
①template < class / typename T> 告诉编译器紧跟的代码里出现T不要报错
② mySwap( T &a T &b ) 类型也需要传入 ,类型参数化
③ myswap(a,b) 自动类型推导 按照a b的类型 来替换T
myswap<int>(a,b) 显示指定类型
(注:普通函数可以进行隐式类型转换 模板不可以)
2、 调用规则
① c++编译器优先考虑普通函数
② 可以通过空模板实参列表的语法限定编译器只能通过模板匹配
③ 函数模板可以像普通函数那样可以被重载
④ 如果函数模板可以产生一个更好的匹配,那么选择模板
3、 模板局限性
① 模板不能解决所有的类型
② 如果出现不能解决的类型,可以通过第三地具体化来解决问题
③ template<> 返回值 函数名<具体类型>(参数)
4、 类模板
① 写法template <T…> 紧跟着是类
② 与函数模板区别,可以有默认类型参数
③ 函数模板可以进行自动类型推导,而类模板不可以
④ 类模板中的成员函数 一开始不会创建出来,而是在运行时才去创建
5、类模板做函数的参数
① 显示指定类型
② 参数模板化
③ 整体模板化
6、当类模板碰到继承
① 基类如果是模板类,必须让子类告诉编译器 基类中的T到底是什么类型
② 如果不告诉,那么无法分配内存,编译不过
③利用参数列表class Child :public Base
(注:类模板不要进行分文件编写,写到同一个文件中,进行声明和实现,后缀名改为.hpp)
四、 类型转换
1、 静态转换 static_cast
① 可以进行基础数据类型转换
② 父与子类型转换
③ 没有父子关系的自定义类型不可以转换
2、 动态转换 dynamic_cast
① 不可以转换基础数据类型
② 父子之间可以转换
父转子 不可以
子转父 可以
发生多态 都可以
3、常量转换 const_cast
不能对非指针或者非引用进行转换

欢迎关注技术公众号,获取更多软件学习干货!
在这里插入图片描述

我们能为你提供什么?
技术辅导:C++、Java、嵌入式软件/硬件
项目辅导:软件/硬件项目、大厂实训项目
就业辅导:就业全流程辅导、技术创业支持
对接企业HR:培养输送优质性人才

;