C++学习:多态与运算符(Day.7~)

news2024/10/3 2:19:38

 总结让人明白。

表明覆盖意图的限定符 override

如图: 

说明:1.使用关键字const后,由于函数特征不同,派生类不会再隐藏基类方法

2.想要覆盖基类方法可使用关键字override,此关键字会强制覆盖基类方法,若覆盖失败,则不能通过编译。

3.禁止覆盖可使用关键字final

被声明为 final 的类不能用作基类,同样,对于被声明为 final 的虚函数,不能在派生类中进行覆盖。
#include<iostream>
using namespace std;

class Fish {
	public:
		Fish() {}
		virtual void Swim() {
			cout << "Fish swims!" << endl;
		}
		virtual ~Fish() {}
};


class Tuna final: public Fish { //禁止再继承Tuna
	public:
		Tuna() {}
		// override Fish::Swim and make this final
		void Swim() override final { //覆盖基类Fish中的Swim方法,并禁止Tuna的子类修改Tuna版本的Swim方法(虽然Tuna不会再有子类了)
			cout << "Tuna swims!" << endl;
		}
		virtual ~Tuna() {}
};

int main() {

	return 0;
}

将复制构造函数声明为虚函数,感兴趣可以自己去了解下,这里不再提。

问与答

问:为何在基类函数声明中使用关键字 virtual,因为即便不使用该关键字,代码也能通过编译?
答: 如果不使用关键字 virtual ,就不能确保 objBase.Function( ) 执行 Derived::Function( ) 。另外,代码够通过编译并不意味着其质量上乘。
问:基类总应包含一个虚析构函数吗?

答:最好如此。如果编写了如下代码:

Base* pBase = new Derived();
delete pBase;
则仅当析构函数 Base( ) 被声明为虚函数时, delete pBase 才会调用析构函数 Derived( )
详见 (5条消息) C++中虚析构函数的作用及其原理分析_逐鹿之城的博客-CSDN博客_虚析构函数的作用
抽象基类(ABC)都不能被实例化,它有何用途呢?
:ABC 并非为实例化而创建的,而仅充当基类。它包含纯虚函数,指定了派生类必须实现哪些
函数,可充当接口。
问:在继承层次结构中,需要在所有虚函数声明中都使用关键字 virtual,还是只需在基类中这
样做?
答: 只需在基类的函数声明中使用关键字 virtual 即可。
问:在 ABC 中,可定义成员函数和成员属性吗?
答: 当然可以。这样的 ABC 也不能被实例化,因为它至少包含一个纯虚函数,派生类必须实现该
函数。 (回答了我再上一章中的问题)

问:假如需要实现圆和三角,要求二者都必须包含Area()和Print()函数,何如?

答:

声明抽象基类 Shape ,并在其中将 Area( ) Print( ) 声明为纯虚函数,从而要求 Circle Triangle
必须实现这些函数。

运算符类型与运算符重载

 operator:n. 经营者;操作员;电话接线员;运算符

increment:n. 增长;增量;增额; 定期的加薪

decrement:n. 消耗;减量;缩减

代码举例:(简单的改变日期写法)

#include<iostream>
using namespace std;

class Date {
	private:
		int day, month, year;
	public:
		Date(int inMonth, int inDay, int inYear)
			: month(inMonth), day(inDay), year(inYear) {};
		Date& operator ++() {
			++day;
			return *this;
		}
		Date& operator --() {
			--day;
			return *this;
		}
		void DisPlay() {
			cout << month << '/' << day << '/' << year << endl;
		}
};

int main() {
	Date holiday(12, 25, 2022);
	holiday.DisPlay();
	++holiday;
	holiday.DisPlay();
	--holiday;
	holiday.DisPlay();
	return  0;
}

样例输出:

12/25/2022
12/26/2022
12/25/2022

转换运算符:

(5条消息) C++类型转换运算符介绍_疯狂的挖掘机的博客-CSDN博客_c++类型转换运算符

 (5条消息) sstream用法_南方以北的博客-CSDN博客_sstream

 有些晦涩,先放一放。

智能指针:

(5条消息) 常见的智能指针_m0_60492395的博客-CSDN博客_智能指针

还是看不懂,/(ㄒoㄒ)/~~

双目运算符:

 单目:一个变量                双目:两个变量

对两个操作数进行操作的运算符称为双目运算符。(第二个参数可从类属性获得)

 日历类的简单操作:

#include<iostream>
using namespace std;

class Date {
	private:
		int day, month, year;
	public:

		/*
		  写函数时将Date当作是一个已知的类,而非通类
		 */

		Date(int inMonth, int inDay, int inYear)
			: month(inMonth), day(inDay), year(inYear) {};

		Date& operator ++() {
			++day;
			return *this;
		}

		Date& operator --() {
			--day;
			return *this;
		}

		Date operator + (int daysToAdd) { // binary addition
			Date newDate (month, day + daysToAdd, year);
			return newDate;
		}

		Date operator - (int daysToSub) { // binary subtraction
			return Date(month, day - daysToSub, year);
		}

		void operator+=(int daysToAdd) {
			day += daysToAdd;
		}

		void operator-=(int daysToAdd) {
			day -= daysToAdd;
		}

		bool operator==(const Date& cmp) {
			return (day == cmp.day) && (month == cmp.month) && (year == cmp.year);

		}

		bool operator!=(const Date& cmp) {
			return !(this/*this指针*/->operator==(cmp));
		}

		bool operator<(const Date& cmp) {
			if (year < cmp.year) {
				return true;
			} else if (month < cmp.month) {
				return true;
			} else if (day < cmp.day) {
				return true;
			} else {
				return false;
			}
		}

		bool operator<=(const Date& cmp) {
			if (this->operator==(cmp)) {
				return true;
			} else {
				return this->operator<(cmp);
			}
		}

		void DisPlay() {
			cout << month << '/' << day << '/' << year << endl;
		}
};



int main() {
	Date holiday(12, 25, 2022);
	//++and--
	holiday.DisPlay();
	++holiday;
	holiday.DisPlay();
	--holiday;
	holiday.DisPlay();
	//+and-
	Date Nextholiday(holiday + 6);
	Nextholiday.DisPlay ();
	Date Previousholiday (holiday - 19);
	Previousholiday.DisPlay();
	//+=and-=
	holiday.operator -= (19);
	holiday.DisPlay();
	holiday += 25;
	holiday.DisPlay();
	//==and!=
	Date holiday1(12, 25, 2022);
	Date holiday2(12, 31, 2022);
	if (holiday1 == holiday2)//只作用于holiday1,将holiday2按引用
		cout << "Equality operator: The two are on the same day" << endl;
	else
		cout << "Equality operator: The two are on different days" << endl;

	if (holiday1 != holiday2)
		cout << "Inequality operator: The two are on different days" << endl;
	else
		cout << "Inequality operator: The two are on the same day" << endl;
	//<,<=,>and>=
	if (holiday1 < holiday2)
		cout << "operator<: holiday1 happens first" << endl;
	if (holiday1 <= holiday2)
		cout << "operator<=: holiday1 happens on or before holiday2" << endl;
	/*..........................*/
	
	return  0;
}

另一实例见下: 

(5条消息) C++运算符重载详解_Mr_Lsz的博客-CSDN博客_c++运算符重载

创建头文件参考:

(5条消息) 教你如何自己创造一个头文件_屁孩君yeah的博客-CSDN博客_头文件怎么建立

(5条消息) 超级简单的头文件制作_恺哥不懂。的博客-CSDN博客_头文件怎么建立

explicit关键字详见:

(5条消息) C++ explicit关键字详解_tiankong19999的博客-CSDN博客_explicit

双目运算符未完待续。。。。

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

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

相关文章

微信功能,你知道多少

用了微信很多年&#xff0c;选择才发现微信收藏的正确打开方式&#xff01;感觉之前白用了那么久微信收藏&#xff0c;只用来保存消息实在是太可惜了&#xff0c;原来它还有那么多实用功能&#xff01;协助日常安排如果每天需要做的事情比较多&#xff0c;可以在这里记录日常工…

谷粒商城之高级篇知识补充

谷粒商城高级篇之知识补充 前言 本篇主要是完成谷粒商城高级篇开发时&#xff0c;我们需要了解并学习一部分补充的知识&#xff0c;才能更好的完成商城业务。 以后我们将商城任务和额外知识分开来编写&#xff0c;方便商城业务的连贯性。 下面是本篇文章各个章节对应的相应…

Apollo星火计划学习笔记——Apollo速度规划算法原理与实践

文章目录1. 速度规划算法总体介绍1.2 不同场景下的ST图1.2.1 主车向前匀速行驶1.2.2 主车先向前匀速行驶&#xff0c;后停车1.2.3 主车跟随前车行驶1.2.4 主车跟随前车刹停1.2.5 障碍车在主车后方跟行1.3 速度规划算法整体流程1.3.1 Task&#xff1a; SPEED_BOUNDS_PRIORI_DECI…

数据结构-堆

1、什么是堆 堆是一种满足以下条件的树&#xff1a;堆中的每一个节点值都大于等于&#xff08;或小于等于&#xff09;子树中所有节点的值。 2、堆的用途 当我们只关心所有数据中的最大值或者最小值&#xff0c;存在多次获取最大值或者最小值&#xff0c;多次插入或删除数据时&…

ArrayList与顺序表(一)

目录 1.线性表 2.顺序表 2.1接口的实现 3.ArrayList的简介 4.ArrayList使用 4.1ArrayList的构造 4.2ArrayList常见的操作 4.3ArrayList的遍历 4.4ArrayList的扩容机制 5.模拟实现一个ArrayList 1.线性表 线性表&#xff1a;是n个具有相同特性的数据元素的有限序列。线性…

[思考进阶]04 优秀的人,都在使用“微习惯”

除了要提升自己的技术能力&#xff0c;思维的学习和成长也非常非常重要&#xff0c;特推出此[思考进阶]系列&#xff0c;进行刻意练习&#xff0c;从而提升自己的认知。 我有个微信群&#xff0c;人很少&#xff0c;都是兄弟&#xff0c;每天打开电脑的时候&#xff0c;我都会有…

朴素贝叶斯分类的python的实现

文章目录介绍GaussianNB()参数介绍实例BernoulliNB()参数介绍实例MultinomialNB()参数介绍实例作者&#xff1a;王乐介绍 sklearn 是 scikit–learn 的简称,是一个基于 Python 的第三方模块。 sklearn 库集成了一些常用的机器学习方法,在进行机器学习任务时,并不需要实现算法,…

Java 并发编程解析 | 如何正确理解Java领域中的并发锁,我们应该具体掌握到什么程度?

写在开头 对于Java领域中的锁&#xff0c;其实从接触Java至今&#xff0c;我相信每一位Java Developer都会有这样的一个感觉&#xff1f;不论是Java对锁的实现还是应用&#xff0c;真的是一种“群英荟萃”&#xff0c;而且每一种锁都有点各有各的驴&#xff0c;各有各的本&…

#P13787. [NOIP2021] 报数

目录 一&#xff0c;题目 二&#xff0c;题意分析 三&#xff0c;做法 1.直接模拟题意 2&#xff0c;用筛法来解 3&#xff0c;正解(加上记忆化) 一&#xff0c;题目 二&#xff0c;题意分析 题目意思是说:每次输入一个数,然后先判断这个数是否为某一个十进制中包含7的数…

Redis 为什么这么快?

1.基于内存实现 Redis 是基于内存的数据库&#xff0c;跟磁盘数据库相比&#xff0c;完全吊打磁盘的速度。 2.高效的数据结构 Redis 一共有 5 种数据类型&#xff0c;String、List、Hash、Set、SortedSet。 不同的数据类型底层使用了一种或者多种数据结构来支撑&#xff0c;目的…

如何选择适合自己的进销存系统软件?

选择一款合适的进销存软件&#xff0c;可以有效解决企业生产经营中业务管理、分销管理、存货管理、营销计划的执行和监控、统计信息的收集等方面的业务问题。 进销存软件一直是一个热门话题&#xff0c;别急&#xff0c;我这就来给你介绍。 一、进销存管理软件 这里我要推荐…

计算机系统概述

计算机系统概述一、操作系统的概念1、定义2、功能和目标二 、操作系统特征1、并发性2、共享性3、虚拟性4、异步性三、操作系统的发展1、手工操作阶段2、批处理阶段——单道批处理系统2、批处理阶段——多道批处理系统3、实时操作系统四、运行机制和体系结构1、运行机制①指令②…

Gitea 的邮件通知

有这样的一个需求&#xff0c;当仓库中被推送或者更新代码的时候&#xff0c;希望在邮件中收到邮件通知。 Gitea 是可以实现这个功能的&#xff0c;但是在默认情况下这个功能是关闭的。 修改配置文件 根据 Gitea 的安装不同&#xff0c;我们的配置文件在&#xff1a;vi /etc…

【正点原子FPGA连载】第六章Petalinux设计流程实战摘自【正点原子】DFZU2EG_4EV MPSoC之嵌入式Linux开发指南

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第六章Petalinux…

【CS硕士三年级BetterBench】2022年终总结(脚踏实地,仰望星空)

2022年终总结 回忆录 2022年焦虑和快乐是这一年中最大的两种情绪了。焦虑主要是因为心里的三块石头&#xff0c;从年初就开始悬着。第一块石头&#xff0c;科研论文录用&#xff0c;第二个石头&#xff0c;拿到国奖&#xff0c;第三个石头是拿到满意的offer。目前只剩下最后一…

【Linux】多文件编译

目录 多文件编译 为什么要分两步编译&#xff1a; makefile文件 makefile里面安装 更改可调式版本 对比Windows中的VS 多文件编译 有以下文件 分两步&#xff1a; 第一步编译&#xff1a;.c->.o 第二步链接&#xff08;可以不用写头文件&#xff09;&#xff1a;.o-…

《图解TCP/IP》阅读笔记(第九章)—— 网络安全相关

第九章 网络安全 本章旨在介绍互联网中网络安全的重要性及其相关的实现技术。 本章的内容在我看来&#xff0c;并没有前几章那么重要&#xff0c;大概有所了解就好。 9.1 TCP/IP与网络安全 起初&#xff0c;TCP/IP只用于一个相对封闭的环境&#xff0c;后来才发展为并无太多…

Python编程 匿名函数,高阶函数

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.匿名函数 1.匿名函数介绍 匿名函数应用 匿名函数作返回值 匿名函数作…

【数据结构】超详细!从HashMap到ConcurrentMap,我是如何一步步实现线程安全的!

什么是HashMap&#xff1f; 在了解 HashMap 之前先了解一下什么是 Map&#xff1b; 什么是Map&#xff1f; 定义 Map 是一个用于存储 Key-Value 键值对的集合类&#xff0c;也就是一组键值对的映射&#xff0c;在 Java 中 Map 是一个接口&#xff0c;是和 Collection 接口同…

注解@Resource,注解@Qualifier

1.在进⾏类注⼊时&#xff0c;除了可以使⽤ Autowired 关键字之外&#xff0c;我们还可以使⽤ Resource 进⾏注⼊&#xff0c;如下代码所示&#xff1a; 运行结果&#xff1a; Autowired 和 Resource 的区别 出身不同&#xff1a;Autowired 来⾃于 Spring&#xff0c;⽽ Reso…