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;
}
C++学习——类的多态相关推荐
- C/C++学习之路: 多态
C/C++学习之路: 多态 目录 多态基本概念 向上类型转换及问题 如何实现动态绑定 抽象基类和纯虚函数 纯虚函数和多继承 虚析构函数 重写,重载,重定义 1. 多态基本概念 多态是面向对象程序设计语 ...
- Java学习-类的隐藏机制(封装性)
Java学习-类的隐藏机制(封装性) 1.封装的含义 2.类的setXXX 和 getXXX 3.this关键字 4.总结 1.封装的含义 封装(encapsulation)是面向对象的三要素之一(其 ...
- python代码学习——类与对象提升(继承、超继承,类的例题,魔术方法)
python代码学习--类与对象提升 继承 继承的特殊属性: 代码示例 方法的重写和覆盖(overrrid) 总结 超继承 继承中的初始化 多继承 例题 类的魔术方法 哈希(hash)和eq方法 bo ...
- Python学习 - 面向对象之多态
Python学习 - 语法入门:https://blog.csdn.net/wanzijy/article/details/125287855 Python学习 - 数据类型:https://blog ...
- Python类的多态
多态:不同的子类对象调用相同的方法,产生不同的执行结果 我还是通过对火车站信息查询的代码理解多态,代码如下: #类的多态 作者:肖俊怡 from prettytable import PrettyTa ...
- 深入java虚拟机学习 -- 类的加载机制(续)
昨晚写 深入java虚拟机学习 -- 类的加载机制 都到1点半了,由于第二天还要工作,没有将上篇文章中的demo讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: ...
- C++语言类的多态介绍和示例
多态按字面的意思就是多种形态.当类之间存在层次结构,并且类之间是通过继承关联时,就可能会用到多态. C++ 多态就是当调用成员函数时,会根据调用函数的对象的类型来执行不同的函数. 示例( ...
- scala 类的多态_Scala多态方法和显式引用
scala 类的多态 The methods in scala can be parametrized with both value and types. Value parameters are ...
- java学习--类与对象
文章目录 java学习--类与对象 类的定义与对象的使用 类的私有成员的使用 java学习–类与对象 类的定义与对象的使用 类的定义与对象的使用 类的定义步骤: public 类名: //定义成员变量 ...
最新文章
- Spring 注解的作用
- Nutanix:将IT基础架构“隐形”,让云更简单
- stm32采集正弦波峰峰值_科研项目 | 基于STM32的永磁同步电机SVPWM控制设计
- 利用spring注解创建bean
- java jsonarray string_String JSONObject JSONArray 转换
- python源码剖析新版_Python 源码剖析之基础知识
- 真无线蓝牙耳机,享受高品质杜比音效
- 对于注塑模具设计的原则,这些核心你掌握了吗?
- 如何把pdf转换成word文档
- Shel脚本-初步入门之《04》
- ANSYS fluent
- win10自动修复无法修复你的电脑的解决方法(操作+原理理解)
- visual studio登陆界面空白_电脑同时登陆两个微信,你会吗?
- 浅谈Thread.setDaemon
- Gentler编程简介
- 【bzoj3165】[Heoi2013]Segment
- the rode to success
- Go设计模式(17)-享元模式
- Python-Django毕业设计重庆工商大学失物招领系统(程序+Lw)
- Vue 富文本编辑器插件 vue-quill-editor 坑!
热门文章
- LeetCode 1601. 最多可达成的换楼请求数目(回溯+剪枝)
- LeetCode 659. 分割数组为连续子序列(哈希)
- LeetCode 722. CPP删除注释(逻辑题)
- LeetCode 198. 打家劫舍(DP)
- LeetCode 744. 寻找比目标字母大的最小字母(二分查找)
- java 画笔跟swing组件_Java学习教程(基础)--Java版本历史(二)
- firefox应用自动全屏显示_【b】—自动化测试:基础selenium—API
- 自动化运维Shell课堂笔记
- 魔兽世界转服务器显示完成,魔兽世界怀旧服:TAQ变简单了,为什么还是出现了AFK大潮?...
- 谁说发 paper 一定要追快打新?2021年,研究 word2vec 也能中顶会!