C++三大特征:多态

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 "
一个类型在现实中没有实体对象,不想实例化出对象,可以设计成抽象类
抽象类:包含纯虚函数的类就是抽象类,抽象类不能实例化出对象、

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 06:40:01       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 06:40:01       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 06:40:01       58 阅读
  4. Python语言-面向对象

    2024-07-12 06:40:01       69 阅读

热门阅读

  1. [linux] git push时需要输入user 和keyword

    2024-07-12 06:40:01       21 阅读
  2. 【AIGC】GPT-4深度解析:自然语言处理的新纪元

    2024-07-12 06:40:01       22 阅读
  3. PyTorch中的CPU和GPU代码实现详解

    2024-07-12 06:40:01       25 阅读
  4. CSS实现从上往下过渡效果

    2024-07-12 06:40:01       28 阅读
  5. 力扣第228题“汇总区间”

    2024-07-12 06:40:01       22 阅读
  6. vue2修改组件样式

    2024-07-12 06:40:01       22 阅读
  7. MongoDB:基础语句及练习

    2024-07-12 06:40:01       26 阅读
  8. Xcode本地化全攻略:打造多语言应用的秘诀

    2024-07-12 06:40:01       25 阅读