多态:理解为:同一个函数有多个表现形式-----重用代码的一种方式
- 什么是多态性 重点 难点
- 静态多态性
- 动态多态性 -重写,
- 纯虚继承与抽象类 重点
面向对象: 封装 继承 多态 抽象
什么是多态性
多态性(polymorphism)是面向对象变成的一个重要特征
- 如果一种语言只支持类,而不支持类,是不能称为面向对象语言的
- 如果一种语言只支持类概念,那么只能称为使用/基于对象的语言
多态主要是在参数里
函数名相同,但执行的具体细节不相同
//重载:函数名相同,参数列表的类型或数量不同
使用函数重载的方式–静态多态或者编译时多态
准备3个版本的函数,输入什么就调用什么的移动方法,实现其移动
这是移动一个人物
若实现多个人物的,可以使用数组 – 容器
调用:
一般不对1.0版本的代码进行修改,做项目是不断添加过程,继承
核心代码不动,添加其他的特性------动态多态
静态多态—不灵活
函数重载—可以有模板函数,函数模板
动态多态性–实现函数重写(重写之后可以实现派生类的特殊功能,若不重写都是基类的基本功能)
在C++11版本之后,为了更高的体现子类方法重写父类方法,我们可以在被重写的方法后面添加override关键字
当传递Herol类型的子类型时,参数类型转换可以自动转换:
向上和向下转换:
- 当B是A的子类型时(class B : public A),就意味着所有对A对象的操作都可以对B对象进行
- 即: B重用A的操作来实现自己的操作
- 向上转型:把子类型对象转换为父类型对象,下面有3个注意点:
1.向上转型是安全的
2.向上转型可以自动完成(自动类型转换)
3.向上转型的过程中,会丢失子类型信息
虚函数的工作原理
虚函数中有一部分隐藏成员(指向虚函数表的指针),还有常规私有,公有成员
派生类重写override时,子类对象的成员函数动作会发生改变
为什么 需要虚析构函数?
C 语言 name = (char*) malloc(sizeof(char) * 20) //释放时需要free
C++ name = new char[20]; //释放时需要delete
如果父类的析构函数是非虚的析构函数,那么释放子类对象时,就只会调用父类的析构函数,而不会调用子类对象的析构函数
解决方案,:将基类的析构函数定义为虚析构函数
抽象类—通常为父类
抽象类是不能够实例化的—直接成为父类
多态–通过不同子类实现不同功能
函数重写是动态多态性–需要纯虚函数。一个类的函数为纯虚函数—抽象类-抽象类不能创建对象