文章目录

  • 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++学习——类的多态相关推荐

  1. C/C++学习之路: 多态

    C/C++学习之路: 多态 目录 多态基本概念 向上类型转换及问题 如何实现动态绑定 抽象基类和纯虚函数 纯虚函数和多继承 虚析构函数 重写,重载,重定义 1. 多态基本概念 多态是面向对象程序设计语 ...

  2. Java学习-类的隐藏机制(封装性)

    Java学习-类的隐藏机制(封装性) 1.封装的含义 2.类的setXXX 和 getXXX 3.this关键字 4.总结 1.封装的含义 封装(encapsulation)是面向对象的三要素之一(其 ...

  3. python代码学习——类与对象提升(继承、超继承,类的例题,魔术方法)

    python代码学习--类与对象提升 继承 继承的特殊属性: 代码示例 方法的重写和覆盖(overrrid) 总结 超继承 继承中的初始化 多继承 例题 类的魔术方法 哈希(hash)和eq方法 bo ...

  4. Python学习 - 面向对象之多态

    Python学习 - 语法入门:https://blog.csdn.net/wanzijy/article/details/125287855 Python学习 - 数据类型:https://blog ...

  5. Python类的多态

    多态:不同的子类对象调用相同的方法,产生不同的执行结果 我还是通过对火车站信息查询的代码理解多态,代码如下: #类的多态 作者:肖俊怡 from prettytable import PrettyTa ...

  6. 深入java虚拟机学习 -- 类的加载机制(续)

    昨晚写 深入java虚拟机学习 -- 类的加载机制 都到1点半了,由于第二天还要工作,没有将上篇文章中的demo讲解写出来,今天抽时间补上昨晚的例子讲解. 这里我先把昨天的两份代码贴过来,重新看下: ...

  7. C++语言类的多态介绍和示例

    多态按字面的意思就是多种形态.当类之间存在层次结构,并且类之间是通过继承关联时,就可能会用到多态. C++ 多态就是当调用成员函数时,会根据调用函数的对象的类型来执行不同的函数.        示例( ...

  8. scala 类的多态_Scala多态方法和显式引用

    scala 类的多态 The methods in scala can be parametrized with both value and types. Value parameters are ...

  9. java学习--类与对象

    文章目录 java学习--类与对象 类的定义与对象的使用 类的私有成员的使用 java学习–类与对象 类的定义与对象的使用 类的定义与对象的使用 类的定义步骤: public 类名: //定义成员变量 ...

最新文章

  1. Spring 注解的作用
  2. Nutanix:将IT基础架构“隐形”,让云更简单
  3. stm32采集正弦波峰峰值_科研项目 | 基于STM32的永磁同步电机SVPWM控制设计
  4. 利用spring注解创建bean
  5. java jsonarray string_String JSONObject JSONArray 转换
  6. python源码剖析新版_Python 源码剖析之基础知识
  7. 真无线蓝牙耳机,享受高品质杜比音效
  8. 对于注塑模具设计的原则,这些核心你掌握了吗?
  9. 如何把pdf转换成word文档
  10. Shel脚本-初步入门之《04》
  11. ANSYS fluent
  12. win10自动修复无法修复你的电脑的解决方法(操作+原理理解)
  13. visual studio登陆界面空白_电脑同时登陆两个微信,你会吗?
  14. 浅谈Thread.setDaemon
  15. Gentler编程简介
  16. 【bzoj3165】[Heoi2013]Segment
  17. the rode to success
  18. Go设计模式(17)-享元模式
  19. Python-Django毕业设计重庆工商大学失物招领系统(程序+Lw)
  20. Vue 富文本编辑器插件 vue-quill-editor 坑!

热门文章

  1. LeetCode 1601. 最多可达成的换楼请求数目(回溯+剪枝)
  2. LeetCode 659. 分割数组为连续子序列(哈希)
  3. LeetCode 722. CPP删除注释(逻辑题)
  4. LeetCode 198. 打家劫舍(DP)
  5. LeetCode 744. 寻找比目标字母大的最小字母(二分查找)
  6. java 画笔跟swing组件_Java学习教程(基础)--Java版本历史(二)
  7. firefox应用自动全屏显示_【b】—自动化测试:基础selenium—API
  8. 自动化运维Shell课堂笔记
  9. 魔兽世界转服务器显示完成,魔兽世界怀旧服:TAQ变简单了,为什么还是出现了AFK大潮?...
  10. 谁说发 paper 一定要追快打新?2021年,研究 word2vec 也能中顶会!