C++学习——类的多态

文章目录

      • 1.重载多态
        • 1.1 函数重载
        • 1.2 运算符重载
      • 2.强制多态
      • 3.类型参数化多态
      • 4.包含多态

类的多态
多态是指同样的消息被不同类型的对象接收时导致不同的行为。
所谓消息是指对类成员函数的调用,不同的行为是指不同的实现,也就是调用了不同的函数。
在C++中,这种多态性可以通过重载多态(函数和运算符重载) 、强制多态(类型强制转换)、
类型参数化多态(模板)、包含多态(继承及虚函数)四种形式来实现。

1.重载多态

重载是多态性的最简单形式,分为函数重载和运算符重载。

1.1 函数重载

重定义已有的函数称为函数重载。在C++中既允许重载一般函数,也允许重载类的成员函数。
如对构造函数进行重载定义,可使程序有几种不同的途径对类对象进行初始化。
class bird {
public:bird(int s):size(s){}void eat() {cout << "我是小鸟,我吃虫子!" << endl;}void eat(int size) {cout << "我是" << size << "cm的小鸟,我吃虫子!" << endl;}void display() {cout << size << endl;}~bird(){}
private:int size;
};
int main() {bird maque(10);maque.eat();maque.eat(17);maque.display();return 0;
}

1.2 运算符重载

C++允许为类重定义已有运算符的语义,使系统预定义的运算符可操作于类对象。
如流插入(<<)运算符和流提取(>>)运算符(原先语义是位移运算)。
class fish {
public:fish(double s):size(s){}fish(){}fish operator +(fish &f2){fish f3;f3.size = (this->size + f2.size) / 2;return f3;}void display() {cout << size << endl;}
private:double size;
};
int main() {fish f1(10), f2(20), f3;f3 = f1 + f2;f3.display();return 0;
}

2.强制多态

强制多态也称类型转换。
可以在表达式中使用3种强制类型转换表达式:
①static_cast<T>(E);②T(E);③(T)E,其中E代表运算表达式,
T代表一个类型表达式。上述任意一种都可改变编译器所使用的规则,以便按自己的意愿进行所需的类型强制。
但是强制多态使类型检查复杂化,尤其在允许重载的情况下,导致无法消解的二义性。

3.类型参数化多态

模板是C++实现参数化多态性的工具,分为函数模板和类模板。
类模板中的成员函数均为函数模板,因此函数模板是为类模板服务的。
template <class T,int N>
class horse {
public:horse(T s):size(s){}void display() {cout << "我是" << N << "号马," << "有" << size << "cm" << endl;}T length() {return 2 * size;}
private:T size;
};
int main() {horse<double, 3> bailongma(120.8);horse<int, 8> chitu(150);bailongma.display();chitu.display();cout << bailongma.length() << endl;cout << chitu.length() << endl;return 0;
}

4.包含多态

C++中采用虚函数实现包含多态。虚函数为C++提供了更为灵活的多态机制,
这种多态性在程序运行时才能确定,因此虚函数是多态性的精华,
至少含有一个虚函数的类称为多态类。包含多态在面向对象程序设计中使用十分频繁。
class caofish {
public:virtual void eat() {cout << "我吃泥" << endl;}
};
class heiyu :public caofish {
public:virtual void eat() {cout << "我吃草鱼" << endl;}
};
int main() {caofish cf;heiyu hy;caofish* ptr=&hy;ptr->eat();return 0;
}

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

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

相关文章

细胞如何获得秩序?除了形成细胞器,还可以发生相分离

来源&#xff1a;集智俱乐部作者&#xff1a;Viviane Callier译者&#xff1a;王百臻 审校&#xff1a;梁金 编辑&#xff1a;邓一雪 导语小小的细胞实际上是一个无比复杂的宇宙。DNA在细胞核中运筹帷幄&#xff0c;指导各种细胞器密切合作&#xff0c;产生功能各异的蛋白质。…

JS设置cookie、读取cookie、删除cookie

cookie是网站设计者放置在客户端的小文本文件&#xff0c;一般后台语言使用的比较多&#xff0c;可以实现用户个性化的一些需求。 javascript使用 document.cookie 来操作cookie同一个域名下的页面,共有一个cookie不同的浏览器分别管理自己的cookie,互不影响1.设置cookie // 设…

数据库基础知识——DDL语言

1.库的管理&#xff1a; 一、创建库 create database 库名#创建一个books库 create database books二、删除库 drop database 库名 三、修改库 rename database 旧库名 to 新库名2.表的管理&#xff1a; 2.1 创建表 CREATE TABLE IF NOT EXISTS stuinfo(stuId INT,stuName V…

从人类交互通信发展简史看元宇宙发展趋势及商业价值

来源&#xff1a;科协频道从通信角度来看&#xff0c;人类社会通信方式的发展历程和趋势&#xff0c;它一共经历了以下几个阶段&#xff1a;通信方式的发展历程和趋势第一阶段几千年以前的人类通过口口相传的方式&#xff0c;实现人与人之间的通信&#xff0c;这种通信方式的深…

字符设备驱动

1 引言 APP&#xff1a;open("/dev/xxx")&#xff0c;read&#xff0c;write    ——  设备字符驱动文件包含属性、主设备号和次设备号C LibrarySystem call interface内核&#xff1a;根据文件类型为字符设备&#xff0c;查找字符设备。根据主设备号查找file_…

yii2的Console定时任务创建

https://www.cnblogs.com/dwj97/p/6632848.html 设置定时任务 linux下&#xff0c;运行crontab -e 30 21 * * * /usr/local/php/bin/php /your_project_path/yii test/test //应用程序 上面的例子表示每晚的21:30执行上面的定时程序 下面是定时任务设置的一些基本介绍 基本格…

数据库基础知识——TCL语言

1.TCL含义 TCL&#xff0c;事务控制语言。通过一组逻辑操作单元&#xff08;一组DML——sql语句&#xff09;&#xff0c;将数据从一种状态切换到另外一种状态&#xff0c;即要么全部成功&#xff0c;要么全部失败。2.特点 &#xff08;ACID&#xff09; 原子性(atomicity)&a…

谷歌时间晶体登上Nature,诺奖得主重大猜想成为现实

来源&#xff1a;机器之心没有能量的供给&#xff0c;没有能量的消耗&#xff0c;它的循环运动会永远持续下去。时间晶体就像是一个「永动机」在不同状态之间永久循环往复而不消耗任何能量。来自斯坦福大学、谷歌、马克思 普朗克复杂系统物理研究所和牛津大学的研究团队声称已…

【GoWeb开发实战】Beego的路由控制

Beego的路由控制 二、路由控制 web框架中&#xff0c;路由是重要的一环&#xff0c;对于beego的路由配置如何&#xff1f; 2.1 默认路由 让我们从入口文件main.go先分析起来吧&#xff1a; package mainimport (_ "beegoDemo/routers""github.com/astaxie/beego…

数据库基础知识——视图

视图 含义&#xff1a;理解成一张虚拟的表 视图和表的区别&#xff1a; 使用方式占用物理空间视图完全相同 不占用&#xff0c;仅仅保存的是sql逻辑表完全相同 占用 视图的好处&#xff1a; 1、sql语句提高重用性&#xff0c;效率高 2、和表实现了分离&#xff0c;提高了安…

挑战唯物论?诺奖得主彭罗斯:意识产生可能是大脑内的「量子叠加」的结果...

来源&#xff1a;新智元量子物理学取得了巨大成功&#xff0c;但其解释仍然不确定。大脑由神经元组成&#xff0c;而神经元又由分子组成&#xff0c;很可能会受到量子效应的影响。量子力学和神经科学能否融合成「量子意识」理论&#xff1f;「我们是谁」&#xff1f;恐怕没有什…

完全背包

题目描述 即0-1背包&#xff0c;把每个物品只能拿一次改为能拿无数次。 思路 //这个位置的状态是不拿&#xff0c;第一次拿&#xff0c;和第n>1次拿 dp[i][j]max(max(dp[i-1][j],dp[i-1][j-v[i]]w[i]),dp[i][j-v[i]]); 拿0次&#xff1a;dp[i-1][j]; 拿1次&#xff1a;dp[i-…

下一个是什么?2022年值得关注的22项新兴技术

来源&#xff1a;参考消息网英国《经济学人》网站11月8日发表题为《下一个是什么&#xff1f;2022年值得关注的22项新兴技术》的文章。在文章列举的22项新技术中&#xff0c;既有今年大热的“元宇宙”、太空旅游、脑机接口&#xff0c;也有备受期待的量子计算、艾滋病病毒疫苗……

数据库基础知识——变量

1.系统变量 1.1 全局变量 作用域&#xff1a;针对于所有会话&#xff08;连接&#xff09;有效&#xff0c;但不能跨重启 查看所有全局变量 SHOW GLOBAL VARIABLES;查看满足条件的部分系统变量 SHOW GLOBAL VARIABLES LIKE %char%;查看指定的系统变量的值 SELECT global.aut…

防止ARP欺骗

前言&#xff1a; 曾经因为宿舍里面的同学经常熬夜打游戏&#xff0c;好言相劝不管用&#xff0c;无奈之下使用arp欺骗他们的主机&#xff0c;使之晚上11点之后游戏延迟&#xff0c;掉线&#xff0c;最后&#xff0c;一到11点同学们就都上床睡觉了。 防止arp欺骗的三种思路&…

孙文智/胡霁/汪小京团队揭示延迟满足的神经基础

来源&#xff1a;北京脑编辑&#xff1a;绿萝导语&#xff1a;20 世纪 60-70 年代&#xff0c;斯坦福大学心理学家瓦尔特•米舍尔团队进行了一系列有关自制力的心理学实验&#xff0c;其中包括著名的棉花糖实验&#xff0c;得出结论&#xff1a;「能为偏爱的奖励坚持忍耐更长时…

数据库基础知识——存储过程和函数

文章目录1.存储过程1.1 创建存储过程1.2 调用存储过程1.3 删除存储过程1.4 查看存储过程2.函数2.1 创建函数2.2 调用函数2.3 函数的删除和查看2.4 函数和存储过程的区别1.存储过程 含义&#xff1a;一组经过预先编译的sql语句的集合 好处&#xff1a; 1、提高了sql语句的重用…

为什么数学家、统计学家和机器学习专家会用不同方式解决问题?

来源&#xff1a;数学建模andMATLAB原文作者&#xff1a;Nir Kaldero翻译&#xff1a;Fibears原文链接: http://www.galvanize.com/blog/2015/08/26/why-a-mathematician-statistician-machine-learner-solve-the-same-problem-differently-2/#.VeUQMNOqoVU乍一看&#xff0c;机…

Bing每日壁纸API分享

CSS中设置背景图片 可以使用此API直接在CSS中设置背景图片: background-image: url(https://bing.biturl.top/?resolution1920&formatimage&index0&mktzh-CN); background-size: 100%; background-repeat: no-repeat;演示地址&#xff1a;http://my.mojxtang.com/…

数据库基础知识——流程控制结构

文章目录1.分支1.1 if函数1.2 case语句1.3 if elseif语句2. 循环1.分支 1.1 if函数 语法&#xff1a;if(条件&#xff0c;值1&#xff0c;值2) 特点&#xff1a;可以用在任何位置1.2 case语句 语法&#xff1a; 情况一&#xff1a;类似于switch case 表达式 when 值1 then …