C++修炼之路之多态--多态的条件与例外,重载+重写+重定义

news2024/9/21 15:50:18

目录

前言

一:构成多态的条件及一些特殊情况(前提是构成父子类)

1.多态是在不同的继承关系的类对象,去调用同一函数,产生了不同的结果

2.两个条件

3.三同的两个例外

1.协变---返回值类型可以不同,但必须是父子类关系的指针或引用

2.派生类重写的虚函数可以不加virtual(建议加上)

3.对于派生类重写的虚函数可以不加virtual的浅浅分析--关于析构中的问题

二:普通调用与多态调用,final和virtual修饰类与成员函数,c++11中的final,override的比较

1.多态调用与普通调用

2.final和virtual修饰类与成员函数

3.c++11中的final和override 

三:重载+重写(覆盖) +隐藏(重定义)的对比

四:抽象类和纯虚函数 +接口继承和实现继承

1.纯虚函数

2.抽象类

3.接口继承 和实现继承

五:经典超易错题

接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧 

前言

对于面向对象的三大特性封装,继承和多态,封装和继承在前面已经介绍了,对于多态简单来说就是多种形态,就是当不同的对象去完成同一个行为时,产生的结果不同,他的实现是基于继承的基础上来完成的,但对于一些细节要格外关注注意,接下来开始介绍多态

一:构成多态的条件及一些特殊情况(前提是构成父子类)

1.多态是在不同的继承关系的类对象,去调用同一函数,产生了不同的结果

比如同样是买各种票,对于学生总是有优惠的,对于普通人是全价

2.两个条件

1.必须是通过父类的指针或引用去调用虚函数

2.被调用的函数必须为虚函数,且派生类必须对基类的虚函数进行重写,就是父子继承关系的两个虚函数,满足三同(函数名,参数类型+参数个数,返回值类型)

3.三同的两个例外

1.协变---返回值类型可以不同,但必须是父子类关系的指针或引用

2.派生类重写的虚函数可以不加virtual(建议加上)

但基类的虚函数的virtual必须写的,不写的的话 则不构成多态

3.对于派生类重写的虚函数可以不加virtual的浅浅分析--关于析构中的问题

1.普通情况

#include <iostream>
using namespace std;

class Person {
public:
	virtual void BuyTicket()
	{
		cout << "Person买票-全价" << endl;
	}
	~Person()
	{
		cout << "~Person()" << endl;
	}
};

class Student : public Person {
public:
	void  BuyTicket()
	{
		cout << "Student买票-半价" << endl;
	}
	~Student()
	{
		cout << "~Student()" << endl;
	}
};
void Func(Person& p)
{
	p.BuyTicket();
}
int main()
{
	Person ps;
	Student st;

	Func(ps);
	Func(st);

	return 0;
}

对于这种情况调用时的析构是没问题的,结果为

 

2.特殊情况:对象是new的

 

对于此时 的父类指针p它既可以指向父类对象,也可以根据切片规则,指向子类对象,此时delete就不能分辨了,这时是因为

delete p  由于多态会转换为p->desturct()+operator delete(p)

而指针p是父类指针,但destruct()不是虚函数,所以是普通调用,依据指针的类型来调用对应的析构函数

解决办法的话,显而易见就是加virtual修饰变成虚函数,所以析构是虚函数,才能正确调用析构

 

但如果这里不支持派生类重写的虚函数可以省略virtual的话,如果我们写了基类的析构的virtual,忘记给派生类重写的虚函数加virtual的话,就会没释放空间,造成内存泄漏,所以为了避免这种情况的发生,支持对于派生类重写的虚函数可以省略virtual,这时就要注意在题目中如果没写派生类重写虚函数的virtual的话,也是构成多态的

二:普通调用与多态调用,final和virtual修饰类与成员函数,c++11中的final,override的比较

1.多态调用与普通调用

多态调用要同时满足两个条件,不满足任意一个条件的 ,都为普通调用

2.final和virtual修饰类与成员函数

注意:final只能修饰类和虚函数,不能修饰别的 

3.c++11中的final和override 

对于final上面已经介绍,对于override是修饰派生类的虚函数,检查是否完成重写,如果没有完成重写的话会报错

三:重载+重写(覆盖) +隐藏(重定义)的对比

 

四:抽象类和纯虚函数 +接口继承和实现继承

1.纯虚函数

在虚函数的后面加上  =0  ,这个函数就是纯虚函数

2.抽象类

含有纯虚函数的类叫做抽象类,抽象类不能实例化出对象

派生类继承后也不能实例出对象,只能重写虚函数,派生类才能实例化出对象

纯虚函数间接规范了派生类必须重写,也更好地体现了接口继承

 辅助理解例子

class Car
{
public:
	virtual void Drive() = 0;
	
	void func()
	{
		cout << "void func()" << endl;
	}
};
	
class Benz :public Car
{
public:
	virtual void Drive()
	{
		cout << "Benz-舒适" << endl;
	}
};
	
class BMW :public Car
{
public:
	virtual void Drive()
	{
		cout << "BMW-操控" << endl;
	}
};
	
void func(Car* ptr)
{
	ptr->Drive();
}
int main()
{
	func(new Benz);
	func(new BMW);
	return 0;
}

3.接口继承 和实现继承

1.普通函数的继承就是一种实现继承,派生类继承了基类函数,可以使用函数,继承的是函数的实现

2.虚函数的继承就是一种接口继承,派生类继承的是基类虚函数的接口,目的是为了重写,达成多态,继承的是接口

五:经典超易错题

对于这道题我们需要仔细来研究里面隐藏的难点

 

这次的分享就到这了,下次会介绍更好玩的多态的原理等内容,敬请期待

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1611771.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【简单讲解下Stylus入门使用方法】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

从OWASP API Security TOP 10谈API安全

1.前言 应用程序编程接口&#xff08;API&#xff09;是当今应用驱动世界创新的一个基本元素。从银行、零售、运输到物联网、 自动驾驶汽车、智慧城市&#xff0c;API 是现代移动、SaaS 和 web 应用程序的重要组成部分&#xff0c;可以在面向客 户、面向合作伙伴和内部的应用程…

数据结构 -- 二叉树二叉搜索树

二叉树 二叉树是这么一种树状结构&#xff1a;每个节点最多有两个孩子&#xff0c;左孩子和右孩子 重要的二叉树结构 完全二叉树&#xff08;complete binary tree&#xff09;是一种二叉树结构&#xff0c;除最后一层以外&#xff0c;每一层都必须填满&#xff0c;填充时要遵…

【Windows游戏】大头菜小子抢银行游戏介绍

游戏介绍 今天写的是一款游戏&#xff0c;叫《大头菜小子抢银行》。 《大头菜小子抢银行》是《大头菜小子避税历险记》的续作&#xff0c;玩家需要联手泡菜团队&#xff0c;进行史上最奇怪的劫案&#xff0c;绑架人质&#xff0c;偷取珍贵财报&#xff0c;探索植物银行的黑暗…

MapReduce工作流程(Hadoop3.x)

MapReduce 是一种用于并行处理大规模数据集的——编程模型和处理框架。它通常用于分布式计算环境中&#xff0c;如Apache Hadoop。 工作流程 1. 切分阶段&#xff08;Splitting&#xff09;&#xff1a; 数据集被分成多个数据块&#xff0c;每个数据块的大小通常在64MB到12…

nginx反向代理及负载均衡

node1192.168.136.55Nginx主负载均衡器node3192.168.136.57Web01服务器node4192.168.136.58Web02服务器node5192.168.135.131客户端&#xff08;测试&#xff09; nginx反向代理 1. 安装nginx 三台机器都安装nginx yum install nginx -y 2. 配置用于测试的Web服务(以下操作…

C++进阶:搜索树

目录 1. 二叉搜索树1.1 二叉搜索树的结构1.2 二叉搜索树的接口及其优点与不足1.3 二叉搜索树自实现1.3.1 二叉树结点结构1.3.2 查找1.3.3 插入1.3.4 删除1.3.5 中序遍历 2. 二叉树进阶相关练习2.1 根据二叉树创建字符串2.2 二叉树的层序遍历I2.3 二叉树层序遍历II2.4 二叉树最近…

ChatGPT研究论文提示词集合1-【主题选择与问题研究、文献综述】

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 目录 1.主题选择与问题定义 2.文献综述 3.书籍介绍 AIPaperPass智能论文写作平台 近期小编按照学术论文的流程&#xff0c;精心准备一套学术研究各个流程的提示词集合。总共14个步骤…

AI翻译英语PDF文档的3种方法

短的文章&#xff0c;直接丢进kimichat、ChatGPT里面很快就可以翻译完成&#xff0c;而且效果很佳。但是&#xff0c;很长的PDF文档整篇需要翻译&#xff0c;怎么办呢&#xff1f; ●腾讯交互翻译TranSmart https://transmart.qq.com/ 软件下载后&#xff0c;点击左边的文件翻…

天才简史——Sylvain Calinon

一、研究方向 learning from demonstration&#xff08;LfD&#xff09;领域的专家&#xff0c;机器人红宝书&#xff08;Springer handbook of robotics&#xff09;Robot programming by demonstration章节的合作者。主要研究兴趣包括&#xff1a; 机器人学习、最优控制、几…

从零自制docker-11-【pivotRoot切换实现文件系统隔离】

文章目录 busyboxdocker run -d busybox topcontainerId(docker ps --filter "ancestorbusybox:latest"|grep -v IMAGE|awk {print $1})docker export -o busybox.tar $containerId or sudo docker export 09bbf421d93f > ./busybox.tar tar -xvf busybox.tar -C …

Python | Leetcode Python题解之第41题缺失的第一个正数

题目&#xff1a; 题解&#xff1a; class Solution:def firstMissingPositive(self, nums: List[int]) -> int:n len(nums)for i in range(n):while 1 < nums[i] < n and nums[nums[i] - 1] ! nums[i]:nums[nums[i] - 1], nums[i] nums[i], nums[nums[i] - 1]for …

域名信息查询同款WHOIS源码

域名查询一般是指查询域名的whois注册信息&#xff0c;域名WHOIS是当前域名系统中不可或缺的一项信息服务。在使用域名进行Internet冲浪时&#xff0c;很多用户希望进一步了解域名、名字服务器详细信息&#xff0c;这就会用到WHOIS。 域名信息查询同款WHOIS源码

在Postgres中,如何有效地管理大型数据库的大小和增长

文章目录 一、定期清理和维护1. VACUUM和ANALYZE2. 删除旧数据和归档 二、分区表三、压缩数据四、配置优化1. 调整维护工作负载2. 监控和日志 五、使用外部存储和扩展1. 外部表和FDW2. 扩展和插件 六、定期备份和恢复测试结论 管理大型数据库的大小和增长是数据库管理员&#x…

EA包图上嵌套的包位置不对

Extreme 2024-4-11 11:36 我从工具栏把一个包拖在另一个包里面&#xff0c;可是项目树上两个包的位置并列&#xff0c;拖了几次结果都一样。我的目的是做一个多层级的包图&#xff0c;是不是&#xff08;EA&#xff09;不能在图上做&#xff1f; UMLChina潘加宇 确实是这样&a…

m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平均分的人数作为函数值返回,将低于平均分的分数放在below所指的数组中。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法和详细的解析。 题干 m个人的成绩…

强固型工业电脑在轮胎成型机设备行业应用

轮胎成型机设备行业应用 项目背景 我国是一个轮胎生产与出口大国&#xff0c;在轮胎的生产过程中&#xff0c;成型工序是生产的关键工序&#xff0c;将半成品的部件按照轮胎的技术规范在成型机上组装成胎胚&#xff0c;工艺较为复杂&#xff0c;对设备加工和定位精度要求较高。…

【Linux学习】gcc与g++的使用与程序翻译的过程

文章目录 修改sudo用户名单gcc与g指令gcc用法g用法 程序翻译的过程函数库动态库与静态库什么是动静态库&#xff1f;动静态库的优缺点ldd指令 这里补充一个前面遗漏的知识&#xff1a; 修改sudo用户名单 必须使用root超级用户进行修改&#xff0c;普通用户是不能访问修改。 …

Spring 事务实现方式:

Spring 事务实现方式&#xff1a; Spring并不直接支持事务&#xff0c;只有当数据库支持事务的时候&#xff0c;Spring才支持事务&#xff0c;Spring只不过简化了开发人员实现事务的开发步骤 Spring事务的实现方式有两种&#xff1a; 一、基于申明式事务&#xff1a; Service…

CCF-CSP真题《202312-2 因子化简》思路+python,c++满分题解

想查看其他题的真题及题解的同学可以前往查看&#xff1a;CCF-CSP真题附题解大全 试题编号&#xff1a;202312-2试题名称&#xff1a;因子化简时间限制&#xff1a;2.0s内存限制&#xff1a;512.0MB问题描述&#xff1a; 题目背景 质数&#xff08;又称“素数”&#xff09;是指…