【C++】多态(多态的构成条件,虚函数重写,override,final,覆盖隐藏对比)

文章目录


前言

多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。
举个栗子:多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。

一、多态的定义及实现

1.多态的构成条件:

  1. 必须通过基类的指针或者引用调用虚函数
  2. 被调用的函数必须是虚函数 ,且派生类必须对基类的虚函数进行重写

二、虚函数

虚函数:即被virtual修饰的类成员函数称为虚函数。

1.虚函数的重写

虚函数的重写(覆盖):派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名字、参数列表完全相同),称子类的虚函数重写了基类的虚函数。

2.虚函数重写的例外(协变)

协变(基类与派生类虚函数返回值类型不同)派生类重写基类虚函数时,与基类虚函数返回值类型不同。即基类虚函数返回基类对象的指针或者引用,派生类虚函数返回派生类对象的指针或者引用时,称为协变。(基类虚函数不能返回派生类的指针或者引用,派生类虚函数也不能返回基类的指针或者引用)

cpp 复制代码
class A
{};

class B : public A
{};

class Person {
public:
	virtual	A* BuyTicket() const { 
		cout << "买票-全价" << endl;
		return 0;
	}
};

class Student : public Person {
public:
	virtual B* BuyTicket() const { 
		cout << "买票-半价" << endl;
		return 0;
	}
};

3.析构函数的虚函数(基类与派生类析构函数名字不同)

问:析构函数加virtual,是不是虚函数重写?

答:是, 因为类析构函数都被处理成destructor这个统一的名字
问:为什么要这么处理呢?

答:因为要让他们构成重写

1.不加virtual的一般情况:

2.不加virtual会出现异常的情况

3.析构函数加上virtual后

加上virtual以后我们就可以根据指针指向的类型利用多态去调用对象对应的析构函数

如果只是普通的析构,他只会根据对象的类型去调用类型对应的析构函数

三、C++11 override 和 final

1.override

检查派生类虚函数是否重写了基类某个虚函数,如果没有重写编译报错。

2.final

1.修饰虚函数,表示该虚函数不能再被重写

2.设计不想被继承的类

四、 重载、覆盖(重写)、隐藏(重定义)的对比

小试牛刀

相关推荐
记得开心一点嘛2 分钟前
Redis封装类
java·redis
lkbhua莱克瓦247 分钟前
进阶-存储过程3-存储函数
java·数据库·sql·mysql·数据库优化·视图
计算机程序设计小李同学20 分钟前
基于SSM框架的动画制作及分享网站设计
java·前端·后端·学习·ssm
玖釉-27 分钟前
[Vulkan 学习之路] 08 - 给图片穿马甲:图像视图 (Image Views)
c++·windows·图形渲染
鱼跃鹰飞33 分钟前
JMM 三大特性(原子性 / 可见性 / 有序性)面试精简版
java·jvm·面试
该怎么办呢1 小时前
基于cesium的三维不动产登记系统的设计与实现(毕业设计)
java·毕业设计
m0_748250031 小时前
C++ 信号处理
c++·算法·信号处理
yuyanjingtao1 小时前
动态规划 背包 之 凑钱
c++·算法·青少年编程·动态规划·gesp·csp-j/s
J不A秃V头A1 小时前
多任务执行时,共享请求对象被并发修改
java
heartbeat..2 小时前
零基础学 SQL:DQL/DML/DDL/DCL 核心知识点汇总(附带连接云服务器数据库教程)
java·服务器·数据库·sql