1.virtual关键字
1.1何为虚函数
virtual用于在base类中声明一个虚函数,[虚函数]的主要作用是[允许]在派生类(也称为子类)中对该函数进行[重写](override)
1.2何为重写
重写就是在drived类中写一个函数(返回类型,名称,参数列表)与base类相同的函数,drived类中的这个函数是会覆盖base类中的这个函数
虚函数和重写之间的关系
二者联系∶如果base类中有一个函数允许被重写,那么这个函数就是虚函数,在函数调用时,可以形成多态
2.组合
何为组合:简而言之,就是在一个class中复用另外一个class
ps:优先使用组合,而不是继承
原因:
组合是一种黑箱复用,继承是一种白箱复用,相对于黑盒,白盒对技术的要求更高//软件工程中,认为类与类之间的耦合度越低越好,
如果两个类之间是继承关系且耦合度较高,那么有一个类要改,那么后面一连串的类都需要更改
/重写和虚函数是紧密相连的,要重写再去写虚函数
3.多态
3.1 多态基础概念:
根据百度的释义如下:多态(Polymorphism)是编程语言和类型论中的一个重要概念,它指为不同数据类型的实体提供统一的接口。多态类型(Polymorphic Type)可以将自身所支持的操作套用到其他类型的值上。在面向对象编程(OOP)中,多态允许不同的对象对同一消息(即方法调用)做出不同的响应,这种能力通过继承和接口实现,提高了代码的灵活性和可扩展性。
顾名思义:多态就是多种状态
形象来讲就是不同类的对象进行相同的活动得到不同的结果
打个比方不同的人(可分为欧皇类和非酋类)去抽卡,他们的结果是有人200抽一井吃满,有人十发便拿下当期SSR风格角色
3.2 虚函数,重写在多态中的作用
虚函数一定要去重写,虚函数嘛,放在那里都虚拟的,虚拟的事物是不好用的,所以需要我们去重写一下
重写和虚函数是紧密相连的,要重写再去写虚函数
3.3多态案例展示
代码
class Person
{
public:virtual void BuyTicket(){cout << "全价票" << endl;}
};class Student :public Person {
public://重写,可以不写virtual,但是建议加上virtual void BuyTicket(){cout << "半价票" << endl;}
};//多态的条件
//1.虚函数重写
//2.基类指针或者使用基类引用void Func(Person& object)
{object.BuyTicket();//动态绑定:多态的特点是指向谁调用谁,
}//void Func(Person* object)
//{
// object->BuyTicket();
// //动态绑定:多态的特点是指向谁调用谁,
//}//不同的对象使用相同的动作得出不同的结果
int main()
{Person p;//对象p调用base类,Person类型的Student s;//对象s调用drived类,Student类型的Func(&p);Func(&s);return 0;}
4.隐藏和重写之间的区别
隐藏只要派生类中的成员和基类中的成员名称相同就好了
而重写派生类的函数名之前是要加上virtual的
4.1隐藏
4.2重写
4.3 有关析构函数的重写
Q:析构函数是否建议设计成虚函数
A:析构函数在基类中一定要设计成虚函数,析构函数的名称最终会被编译器改成destruct
5. 有关关键字override和final
5.1 override
作用:用于编译时检查派生类重写函数是否成功
5.2 final
作用:
a. 修饰一个类时候可以阻止这个类被继承
b.修饰一个虚函数时可以阻止这个虚函数被重写
6. 重写,重载,重定义三者间的区别
重载:函数名相同:参数列表不同
复写(覆盖) :两个函数分别在基类和派生类,函数名/参数/返回值必须相同,两个函数都必须是虚函数
重定义(隐藏) :两个函数分别在基类和派生类中,函数名相同,两个基类和派生类不构成重写就是重定义
7.抽象类
纯虚函数:在虚函数后面加上" =0 "
一个类型在现实中没有实体对象,不想实例化出对象,可以设计成抽象类
抽象类:包含纯虚函数的类就是抽象类,抽象类不能实例化出对象、