多态的四种表现形式

2023-10-27

多态的四种表现形式

在之前一提到多态,我下意识就是虚函数重写构成的运行时多态。直到看了一篇文章,才反应过来多态有四种表现形式。cpp-polymorphism

  • 运行时多态(虚函数)
  • 编译时多态(模板)
  • 重载
  • 类型转换

运行时多态(Subtype Polymorphism/Runtime Polymorphism)

运行时多态就是派生类重写基类的虚函数,在调用函数里,参数为基类的指针或引用,会构成多态。我之前写过一篇多态的原理,就是在讲多态(运行时多态)在底层是怎么实现的

多态的实现原理

举个例子:比如买票这个行为,成人去买就是全价,学生买就是半价票。但是不管成人还是学生都是人这个体系。所以我们需要根据谁来买票才能决定价格,这个时候就需要多态。

#include <iostream>

class ticket
{
public:
	virtual void price() = 0;
};

class adult : public ticket
{
public:
	virtual void price() override
	{
		std::cout << "成人全价!" << std::endl;
	}
};

class student : public ticket
{
public:
	virtual void price() override
	{
		std::cout << "学生半价!" << std::endl;
	}
};

void BuyTicket(ticket& t)
{
	t.price();
}

int main(void)
{
	adult a;
	student s;

	BuyTicket(a);
	BuyTicket(s);
	return 0;
}

在这里插入图片描述

编译时多态(Parametric Polymorphism/Compile-Time Polymorphism)

编译时多态就是模板。在程序编译时,编译器根据参数的类型,就将生成某种类型的函数或类。我之前关于模板的总结:

C++泛类–函数模板、类模板

举个简单的例子:Add() 函数是一个非常简单的函数,但是如果你写一个整型的 Add 函数,那么我想加 double 型的呢?你再写一个 double 型的 Add 函数,那么我想加 char 型的呢?

这个时候就用到了模板,我们先定义一个逻辑,具体类型等编译时再生成该类型的函数或类。

#include <iostream>

template<class T>
T Add(T lhs, T rhs)
{
	return lhs + rhs;
}

int main(void)
{
	Add(1, 2);
	Add(2.0, 3.0);
	Add('a', 'b');
	return 0;
}

重载(Ad-hoc Polymorphism/Overloading)

函数名相同,参数不同就构成了重载。重载主要用于函数,当某个函数的功能无法处理某些参数的情况时,我们就可以重载一个函数来单独处理。

举个例子:比如说上面的 Add 函数,当前内置类型都可以处理,但是如果我传两个字符串怎么办?就不可以像刚才那么加了。得重载一个函数单独处理。

#include <iostream>
#include <string>

int Add(int lhs, int rhs)
{
	return lhs + rhs;
}

std::string Add(const std::string& lhs, const std::string& rhs)
{
	std::string ans(lhs);
	ans += rhs;

	return ans;
}

int main(void)
{
	Add(1, 2);
	Add("abc", "def");

	return 0;
}

类型转换(Coercion Polymorphism/Casting)

类型转换主要分为四种:

  • static_cast: 相当于隐式类型转换。
  • const_cast: 这个可以去除一个 const 变量的 const 性质,使可以改变它的值。
  • reinterpret_cast: 相当于强制类型转换。
  • dynamic_cast: 这个可以使子类指针或引用赋值给父类指针或引用。

类型转换很简单,这里就不多赘述了。

Ending

这篇博客主要是强调了多态有四种形式,并不单单是运行时多态。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多态的四种表现形式 的相关文章

随机推荐

  • 字节跳动飞书音视频服务器开发面经 (小结)

    点关注 不迷路 持续更新Java相关技术及资讯 一面 1 自我介绍 2 讲讲你项目中用到的rtsp协议 3 你的项目中如何做的yuv到rgb的变换 为什么不直接用yuv 4 char 和 string有什么区别 实际中哪一个用的比较多 为什
  • 《我想进大厂》之网络篇夺命连环12问

    谈一谈你对TCP IP四层模型 OSI七层模型的理解 为了增强通用性和兼容性 计算机网络都被设计成层次机构 每一层都遵守一定的规则 因此有了OSI这样一个抽象的网络通信参考模型 按照这个标准使计算机网络系统可以互相连接 物理层 通过网线 光
  • java与SQL Server 2014连接

    首先打开数据库 创建一个数据库 然后开启数据库服务就好了 接下来 打开Myeclipse 创建工程 再创建包 创建包后 再创建类 结构如下 然后 再写类内容 package jdbcs import java sql import java
  • mysql 的select语句_MYSQL SELECT语句新手

    有没有办法可以 SELECT SELECT from table2 FROM table1 在table2中 我有一个列表 我想从table1中选择 如下所示 本周2015年4月24日开始 2015年1月31日开始 2015年07月02日开
  • linux运维工程师培训课程_Linux运维工程师面试赋能

    最近很多朋友通过各种渠道找到我 说自己的 朋友 亲戚 同事 毕业后找不到工作 部分同学自学了很长时间或者也参加过培训还是找不到 更有部分在职的朋友之前的工作也挺好 但是一跳槽突然发现也找不到了 都连面试没有 很迷茫也很痛苦 找一段时间之后信
  • 怎么把pdf转换成高清图片?

    怎么把pdf转换成高清图片 最近 我的同事遇到了一个问题 现在她需要将一些pdf文件转换成高清的图片 这件事情让让她感到非常无助 因为她非常着急需要将这些文件转换为图片格式 以便更好的在今后的工作中进行使用 她曾经尝试了很多工具和方法 也找
  • 2013年11月11日--12月19日(总共50小时,剩4822小时)

    11月11日 白天5小时 11月12日 白天5小时 11月13日 现在凌晨2点 打算封装下昨天的DDRAW引擎 填充函数的 实际上 应该算1个引擎 3点睡着 上午2小时 下午3小时 晚上2小时 共8小时 11月14日 4点起床 突然感觉 根
  • OpenCascade安装编译

    重新编译OpenCascade 在漫长的等待过程中 记录一下编译的流程 下载安装 OpenCascade官网中提供了直接安装的二进制版本 如果只是简单的使用需求可以直接下载安装 二进制版本使用VC 2017 64 bit编译 官网地址 源码
  • WSL搭建Java开发环境

    目录 安装WSL Ubuntu 18 04 修改默认用户为root 并修改用户目录 选 修改apt源 加快下载速度 选 Upgrade ubuntu Install xfce desktop Specify the display serv
  • Linux mariadb数据库主从实现

    一 环境准备 主数据库服务器 主机地址 172 16 1 51 从数据库服务器 主机地址 172 16 1 52 二 软件安装 部署 主数据库服务器 安装mariadb数据库 命令 yum isntall y mariadb mariadb
  • 【一】为什么有时候在cmd里pip的包,pycharm里面找不到?

    一 为什么我重装了一遍python 说来也算曲折离奇 今天下午 2021 11 8 实验室突然来了个不大不小的任务 我打开pycharm打算开始工作 然后发现 我的pycharm瘫了 毛病只有一个 双击图标打不开 无论如何都打不开 无奈之下
  • ASP.net web应用 GridView控件常用方法

    GridView 控件是 ASP NET Web Forms 中常用的数据展示控件之一 它提供了一个网格形式的表格 用于显示和编辑数据 GridView 控件对于包含大量数据 需要进行分页 排序和筛选的情况非常有用 GridView 控件的
  • 使用Python+Selenium的截图方法,这些必须要知道

    01 直接截取网页全屏 截全屏的时候 我们用到的内置方法为save screenshot demo1 png from selenium import webdriver from time import sleep class test
  • [YOLO专题-13]:YOLO V5 - ultralytics制作自己的训练数据集

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 122288423 目录 前言
  • Setup and Hold time and clocking block in system verilog

    原文链接 http systemverilog123 blogspot com 2016 02 setup and hold time and clocking block html Friday February 5 2016 Setup
  • wirehark数据分析与取证misc1.pcap

    什么是wireshark wiresharek wireshark misc1 pcap数据包 wiresharek Wireshark 前称Ethereal 是一个网络封包分析软件 网络封包分析软件的功能是检索取网络封包 并同时显示出最详
  • C++值传递和引用传递

    1 值传递 值传递的定义 形参是实参的拷贝 改变形参的值并不会改变实参的值 从被调用函数的角度来看 值传递的方向是单向的 由实参传递到形参 参数的值只能传入不能传出 当函数的内部需要修改参数 并且不希望这个改变影响调用者时 采用值传递的方式
  • 信创大潮下,产业金融路在何方?

    一个金融数字化转型的底层逻辑正在显现 从客户需求出发 应用层 平台层升级 迭代 当达到开发天花板时 将会倒逼底层基础设施升级 迭代 前后端加速融合 作者 斗斗 编辑 皮爷 出品 产业家 2805 个银行网 点终止营业 网点正在 瘦身 一个事
  • convert_rknn.py onnx转rknn load_onnx函数报错: KeyError ‘output‘

    报错 原因 输出层的设置不对 解决方式 1 查看onnx模型的输出层名称 网页输入netron app https netron app 在网站内打开自己的onnx模型 然后找到模型最后的Reshape层 分别单击Reshape模块 查看O
  • 多态的四种表现形式

    多态的四种表现形式 在之前一提到多态 我下意识就是虚函数重写构成的运行时多态 直到看了一篇文章 才反应过来多态有四种表现形式 cpp polymorphism 运行时多态 虚函数 编译时多态 模板 重载 类型转换 运行时多态 Subtype