抽象类:
**有些函数由于信息不够具体,而无法实现**
由此而来的纯虚函数:在基类中声明的纯虚函数,在基类中无法实现(是因为在基类中定义的信息不够具体,不是学的知识不够),于是这个函数没办法规定具体的算法,但是为了规定整个类家族的统一的行为和对外接口,又需要再比较高层次的基类中定义这么一个函数。
在函数头之后接一个=0,表示没有函数体
只要是带有纯虚函数的类都叫抽象类,因为这样的类它还没有些东西没有实现,所有不能产生实例,抽象类不能定义对象。
通过基类指针可以接收不同派生类对象的地址,然后去调用在基类中定义过的这个函数名,就是配合着虚函数这种动态绑定机制去利用多态性的一种很好的方式。
若派生类不能实现那些在基类中没有实现的纯虚函数,派生类仍然继续作为抽象类,还是没办法实例化,定义对象。
抽象类是用来作为基类使用的,不能定义对象,其作用是用来规定整个类家族的统一对外接口和必须具有的功能。
override:
多态行为的基础:基类声明一个虚函数派生类声明一个函数覆盖该虚函数,要求:函数原型完全一样
override就是用来防止开发者在使用多态时,在派生类中需要覆盖的函数与原型不同或漏写参数,在函数前加上override,编译器就会自动去基类中查找相同原型的函数,找不到则报错
final
继承意味着一定要对它进行修改,不修改的话直接使用即可,与现实世界中的继承不同。
当不希望功能被修改时,需要使用final,它并不是关键字,但可以当关键字理解。
在类名后加final,表明该类不允许被继承。
在函数名后加final,表明函数不允许被覆盖,即不允许被重写
编译器会生成适合这种数据类型的数据容器以及算法函数
函数模板:针对算法逻辑相同,参数不同
针对多个几乎一样的函数体
函数模板不可以直接被调用,是编译器依据函数模板去生成一个函数
类模板:
template <模板参数类>
class 类名
{类成员声明}
在类模板以外定义成员函数,都要带上template<模板参数表>,其他部分相同