当前位置: 首页 > news >正文

跟我学c++中级篇——静态多态

一、多态

Polymorphism,多态。学习过c++的人如果不知道多态,基本上就是打入c++内部的C程序员了。在前边曾经对多态进行过分析,对其中的虚函数(虚表等)也进行过较为详细的说明。
多态其实非常好理解,不要硬扣书本上的定义。多态,顾名思意,就是一种行为,多种状态结果。明白了这个意思,再回头和概念对照,就非常容易理解了。
多态可以分为静态多态和动态多态两类,一般来说,在国内的教科书里,只会讲后面的动态多态。估计原因是动态多态比较容易成体系的和继承一起来分析说明,而静态多态需要的知识体系相对分散许多,又和实际应用紧密结合,所以很多国内的教科书就将其略去了。
另外还可以对多态划分成通用多态(universal polymorphism)和特定多态(Ad-hoc polymorphism),就看划分的标准的和方式了。
所以在这里,不对动态多态进行分了,只对静态多态进行一个总结性的分析说明。

二、静态多态

静态多态和动态多态不同在于,静态多态的实现是在编译期实现的,而动态多态是在运行时绑定的,所以动态多态的行为又叫做迟后联编。既然静态编译是在编译期实现的,那么学习过C++的程序员就可以想一下,在编译实现的技术有哪些?尽量想,想得到的并和多态的实现结果能扯上关系的,基本就是它了。
那么在c++中有哪几种技术可以实现静态多态呢?
1、模板和宏
其实这个非常好理解,利用模板可以轻松的实现类似多态的方式,所以模板和宏是实现静态编译的最强大的方式。在这种方式里,特别需要注意带参数的宏实现,也就是常见的带参数的宏实现。
2、函数重载(或运算符重载)
这个就不用详细介绍了吧,前面已经分析过很多了。

其实这两类就是参数化多态和非参数化多态(或者叫特定多态)的具体形式。这里顺便介绍一下,所以特定多态(Ad-hoc polymorphism),又可以分为强制多态和重载多态,前者指在参数传递时的隐式转化形成的多态后者只函数的重载造成的多态。

三、例程

在知晓了静态多态的定义后,再看下面的例程加深一下印象:

#include <iostream>
template <class T>
class Base
{
public:void Display(){static_cast<T*>(this)->Data();}static void Call(){T::Call();}
};class Derived : public Base<Derived>
{
public:void Data() { std::cout << "Derived function :Data()" << std::endl; };static void Call() { std::cout << "Derived function :Call()" << std::endl; };
};
int main()
{Derived d;Base<Derived> *b = &d;b->Display();b->Call();
}

上面这个例程在前面的CRTP中进行过分析,应该很好理解。
再看一个宏实现多态的:

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include <iostream>#define Data(T) \
struct data_ ##T \
{\T data;\
}int main()
{Data(int) dInt = { 16 };Data(char) dDb = {'a'};std::cout<< dInt.data<<","<< dDb.data<<std::endl;return 0;
}

同样非常好理解,如果有看过MFC相关源码的,可以发现这个只是一个非常小的实现罢了。不过,在绝大多数情况下,不建议使用宏来实现复杂的功能,包括上面的这种静态多态。
至于重载和运算符重载的例程满天飞,这里就不再赘述了。大家如果有不熟悉的翻翻书就可以了。

四、总结

从比较正式的定义来说,在c++中,一般不会把特定多态或者宏多态称为多态,以方便和C语言区分,一般来说,静态多态指的就是模板的静态多态。
其实很多的定义和概念并不是说有多么特别的技术在内,很重要的一点在于通过这些定义或概念来更好的理解实际应用中的应用。可以简单将其当成一种对实际应用的抽象,从某种角度了对知识体系的一种系统的归类总结。这是学习编程的另外一种经验,大家可以借鉴一下。

相关文章:

跟我学c++中级篇——静态多态

一、多态 Polymorphism&#xff0c;多态。学习过c的人如果不知道多态&#xff0c;基本上就是打入c内部的C程序员了。在前边曾经对多态进行过分析&#xff0c;对其中的虚函数&#xff08;虚表等&#xff09;也进行过较为详细的说明。 多态其实非常好理解&#xff0c;不要硬扣书…...

设计模式--桥接模式(Bridge Pattern)

桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;它主要是用于将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。 桥接模式主要包含以下几个角色&#xff1a; Abstraction&#xff08;抽象类&#xff09;&#xff1a;定义抽象类的…...

统计图饼图绘制方法(C语言)

统计图饼图绘制方法&#xff08;C语言&#xff09; 常用的统计图有条形图、柱形图、折线图、曲线图、饼图、环形图、扇形图。 前几类图比较容易绘制&#xff0c;饼图绘制较难。今值此介绍饼图的绘制方法。 本方法采用C语言的最基本功能&#xff1a; &#xff08; 1.&#xff09…...

洛谷C++简单题小练习day12—寻找最小值小程序

day12--寻找最小值--2.16 习题概述 题目描述 给出 n 和 n 个整数 ai​&#xff0c;求这 n 个整数中最小值是什么。 输入格式 第一行输入一个正整数 n&#xff0c;表示数字个数。 第二行输入 n 个非负整数&#xff0c;表示 1,2…a1​,a2​…an​&#xff0c;以空格隔开。 …...

相机图像质量研究(13)常见问题总结:光学结构对成像的影响--鬼影

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…...

车载诊断协议DoIP系列 —— 车辆以太网节点需求汇总

车载诊断协议DoIP系列 —— 车辆以太网节点需求汇总 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,…...

掘根宝典之C++包含对象的类,私有继承,保护继承,三大继承方式总结

包含对象成员的类 包含&#xff0c;组合和层次化&#xff1a;一个类里面的类成员之一是个类对象 我们来看个例子 #include<iostream> using namespace std; class AA { private:int a_; public:AA(int a):a_(a){}void A(){cout << a_ << endl;} }; class …...

第六篇:MySQL图形化管理工具

经过前五篇的学习&#xff0c;对于数据库这门技术的理解&#xff0c;我们已经在心中建立了一个城堡大致的雏形&#xff0c;通过命令行窗口&#xff08;cmd&#xff09;快速上手了【SQL语法-DDL-数据定义语言】等相关命令 道阻且长&#xff0c;数据库技术这一宝藏中还有数不清的…...

计算机网络——12DNS

DNS DNS的必要性 IP地址标识主机、路由器但IP地址不好记忆&#xff0c;不便于人类用使用&#xff08;没有意义&#xff09;人类一般倾向于使用一些有意义的字符串来标识Internet上的设备存在着“字符串”——IP地址的转换的必要性人类用户提供要访问机器的“字符串”名称由DN…...

vue3-应用规模化-工具链

工具链 项目脚手架 Vite Vite 是一个轻量级的、速度极快的构建工具&#xff0c;对 Vue SFC 提供第一优先级支持。作者是尤雨溪&#xff0c;同时也是 Vue 的作者&#xff01; 要使用 Vite 来创建一个 Vue 项目&#xff0c;非常简单&#xff1a; &#xff08;推荐&#xff09…...

EasyExcel动态列导出

测试代码地址&#xff1a;https://gitee.com/wangtianwen1996/cento-practice/tree/master/src/test/java/com/xiaobai/easyexcel/dynamiccolumn 官方文档&#xff1a;https://easyexcel.opensource.alibaba.com/docs/2.x/quickstart/write 一、实现方式 1、根据需要导出的列…...

JAVA面试题11

什么是Java的访问修饰符&#xff0c;并列出它们的作用。 Java的访问修饰符包括public、private、protected和默认。它们的作用如下&#xff1a; public: 可以被任何其他类访问。 private: 只能被所在类访问&#xff0c;其他类无法访问。 protected: 可以被所在类和同一个包中的…...

工业数据采集的时间不确定性及PLC-Recorder的通道偏移功能

目录 一、缘起 二、效果展示 三、设置方法 四、小结 一、缘起 大家都知道采集软件首先要尽可能还原数据原来的状态&#xff0c;给用户提供一个可以信赖的参考。但是&#xff0c;数据采集又有很多随机因素&#xff1a;Windows是一个周期不严格的系统、以太网通讯有时间波动、…...

十五、Object 类

文章目录 Object 类6.1 public Object()6.2 toString方法6.3 hashCode和equals(Object)6.4 getClass方法6.5 clone方法6.6 finalize方法 Object 类 本文为书籍《Java编程的逻辑》1和《剑指Java&#xff1a;核心原理与应用实践》2阅读笔记 java.lang.Object类是类层次结构的根…...

计算机网络——06分组延时、丢失和吞吐量

分组延时、丢失和吞吐量 分组丢失和延时是怎样发生的 在路由器缓冲区的分组队列 分组到达链路的速率超过了链路输出的能力分组等待排到队头、被传输 延时原因&#xff1a; 当当前链路有别的分组进行传输&#xff0c;分组没有到达队首&#xff0c;就会进行排队&#xff0c;从…...

[C#] 如何调用Python脚本程序

为什么需要C#调用python&#xff1f; 有以下几个原因需要C#调用Python&#xff1a; Python拥有丰富的生态系统&#xff1a;Python有很多强大的第三方库和工具&#xff0c;可以用于数据科学、机器学习、自然语言处理等领域。通过C#调用Python&#xff0c;可以利用Python的生态系…...

AlmaLinux更换鼠标样式为Windows样式

文章目录 前言先看看条件与依赖第一步&#xff1a;测试最终效果第二步&#xff1a;使用CursorXP修改鼠标样式CurosrXP安装CursorXP使用 第三步&#xff1a;Linux端环境搭建与命令执行UbuntuFedora其他系统均失败 第四步&#xff1a;应用主题 前言 只不过是突发奇想&#xff0c…...

BUGKU-WEB 留言板

题目描述 题目无需登录后台&#xff01;需要xss平台接收flag&#xff0c; http协议需要http协议的xss平台打开场景后界面如下&#xff1a; 解题思路 看到此类的题目&#xff0c;应该和存储型xss有关&#xff0c;也就是将恶意代码保存到服务器端即然在服务器端&#xff0c;那就…...

Linux之动静态库

今天我们来讲动静态库&#xff01; 首先我们来粗粒度的划分一下动态库和静态库。 动态库就是只有一份库文件&#xff0c;所有想用该库的文件与改库文件建立链接&#xff0c;然后使用。这样可以提高代码复用率&#xff0c;避免重复拷贝产生没必要的内存消耗。 静态库&#xf…...

手机常亮屏不自动灭屏

一. 基础知识介绍 1. WakeLock&#xff08;休眠锁&#xff09; WakeLock用于保持设备的唤醒状态&#xff0c;有些情况下&#xff0c;即时用户不操作App&#xff0c;我们也需要保持屏幕处于唤醒状态&#xff0c;以保证用户体验&#xff0c;比如视频类APP和计步类APP&#xff0c;…...

TDengine 快速体验(Docker 镜像方式)

简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能&#xff0c;本节首先介绍如何通过 Docker 快速体验 TDengine&#xff0c;然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker&#xff0c;请使用 安装包的方式快…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

基于当前项目通过npm包形式暴露公共组件

1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹&#xff0c;并新增内容 3.创建package文件夹...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言&#xff1a; 最近在做行为检测相关的模型&#xff0c;用的是时空图卷积网络&#xff08;STGCN&#xff09;&#xff0c;但原有kinetic-400数据集数据质量较低&#xff0c;需要进行细粒度的标注&#xff0c;同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

Java编程之桥接模式

定义 桥接模式&#xff08;Bridge Pattern&#xff09;属于结构型设计模式&#xff0c;它的核心意图是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式通过组合关系来替代继承关系&#xff0c;从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

MySQL 主从同步异常处理

阅读原文&#xff1a;https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主&#xff0c;遇到的这个错误&#xff1a; Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一&#xff0c;通常表示&#xff…...