1.概念
概念:
- 通俗来说就是多种形态;
- 也就是说就是不同对象完成某个行为会产生不同的状态
例如:
- 比如买票这个行为,当普通人买票时,是全价买票;学生买票时,是半价买票;
2.代码实现
虚函数:被virtual修饰的类成员(不能是静态)函数
条件1:在继承体系下,父类中有虚函数,且子类对父类中的虚函数进行了重写
条件2:虚函数只能通过父类的引用或者指针调用
满足了两个条件才能实现多态 多态的体现:程序运行时,根据基类的指针指向不同类的对象,选择对应的虚函数进行调用
3.重写
构成重写的条件
- 父类函数一定要是虚函数(一定要加关键字),子类可以不加关键字但是最好加上;
- 父子类虚函数原型要一致:函数名,参数列表,返回值类型;
例外:协变和析构函数重写 - 子类虚函数访问权限,可以与父类被重写虚函数的访问权限无关
- 子类函数前不用添加virtual也是虚函数
1.协变:返回值类型可以不同
2.析构函数重写:函数名可以不同 建议将父类的析构函数设置为虚函数,这样可以防止因子类涉及到资源管理造成内存泄漏 只需在子类析构函数前加virtual关键字即可 原因:将父类析构函数改成虚函数后,只要子类析构函数显式给出,两个类的虚构函数构成了重写
其它关键字
override:用于修饰子类虚函数,添加于函数括号之后
作用:
- 在编译阶段,检查子类虚函数是否对父类中哪个虚函数进行了重写;
- 如果被override修饰的子类虚函数重写了某个虚函数,编译通过,否则失败
final:用于修饰父类虚函数,添加于函数括号之后
作用:表明该父类虚函数不能被子类虚函数重写
final:用于修饰类,添加于不被继承的类名之后
作用:表明该类不能再被继承
函数重载、函数重定义、函数重写的区别
在继承体系中,如果父类和子类两个 “成员函数” 名相同,不是重写就是重定义 图片来源于比特教育
|