C++之仿函数和虚函数

news2024/12/23 14:16:13

仿函数(Functor)虚函数(Virtual Function)是 C++ 中两个不同的概念,它们在功能和使用场景上有显著的区别。

1. 仿函数(Functor)

定义:

仿函数(也称为函数对象)是指可以像函数一样调用的对象。它通过重载类中的 operator() 实现函数调用的行为。

主要特点:
  • 仿函数是通过重载 operator() 实现的,使得对象可以像普通函数一样被调用。
  • 仿函数对象可以存储状态(通过类的成员变量),因此可以比普通函数更加灵活。
  • 在模板编程中,仿函数经常用于策略模式(如 C++ 标准库中的排序和搜索函数)。
#include <iostream>
using namespace std;

// 定义一个仿函数类
class MyFunctor {
public:
    // 重载 operator(),使对象可以像函数一样调用
    int operator()(int x) const {
        return x * x;
    }
};

int main() {
    MyFunctor functor;  // 创建仿函数对象
    int result = functor(5);  // 使用仿函数对象像调用函数一样调用
    cout << "Result: " << result << endl;  // 输出 25
    return 0;
}

 

解释:
  • MyFunctor 是一个类,它重载了 operator(),使得类的实例 functor 可以像普通函数一样调用。
  • functor(5) 相当于调用了 functor.operator()(5),因此输出 25
使用场景:
  • 仿函数通常用于算法库(如 STL)中,它们可以携带状态,并且可以通过类的成员变量自定义函数的行为。
  • 例如,在 STL 的 sort 函数中,你可以传递仿函数作为自定义的比较器。

 

2. 虚函数(Virtual Function)

定义:

虚函数是指在基类中声明并且可以在派生类中被重写的成员函数。虚函数的主要目的是支持多态,即通过基类指针或引用调用派生类的实现。

主要特点:
  • 虚函数允许派生类重写基类的函数,从而实现多态行为。
  • 当通过基类指针或引用调用虚函数时,会根据实际指向的对象类型决定调用哪个版本的函数(动态绑定)。
  • 虚函数在基类中使用 virtual 关键字声明。
#include <iostream>
using namespace std;

// 基类
class Base {
public:
    virtual void show() {
        cout << "Base class show" << endl;
    }
};

// 派生类
class Derived : public Base {
public:
    void show() override {
        cout << "Derived class show" << endl;
    }
};

int main() {
    Base* basePtr;
    Derived derivedObj;
    basePtr = &derivedObj;
    
    // 通过基类指针调用虚函数,实际调用的是派生类的实现
    basePtr->show();  // 输出 "Derived class show"
    return 0;
}

 

解释:
  • Base 类有一个虚函数 show(),它在派生类 Derived 中被重写。
  • 通过基类指针 basePtr 指向派生类对象 derivedObj,调用 basePtr->show() 时,由于 show() 是虚函数,程序会动态决定调用 Derived 类的 show() 函数,而不是 Base 类的版本。这就是多态的实现。
使用场景:
  • 虚函数用于继承多态的场景,允许基类指针或引用调用派生类的重写版本,从而使代码更加灵活和可扩展。
  • 例如,通常在面向对象设计中,虚函数用于接口定义和派生类的具体实现。

 3. 仿函数 vs. 虚函数

 

总结:

  • 仿函数是一种让对象具备函数调用能力的机制,常用于算法库和模板编程中,适合需要在对象中保存状态的场景。
  • 虚函数是用于继承体系中的多态实现,通过基类指针或引用在运行时决定调用哪个类的函数版本,通常用于面向对象编程的多态设计。

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

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

相关文章

【原理图PCB专题】案例:原理图设计检查为什么要检查全局网络?

本案例发生在新人的PCB设计文件中,当然就算硬件老人们,其实只要不注意也很容易出现这种全局网络乱用的问题。 如下所示是给新人的接口参考图纸,要求使用嘉立创绘制16个相同的接口做一个工装板。同时还要增加单片机实现切换控制功能。可以看到座子的24个管脚中使用到了3.3V、…

五种MP3转换器推荐,音频转换不发愁!

每当遇到心仪的歌曲或珍贵的音频资料&#xff0c;却因为格式不兼容而无法在所有设备上顺畅播放时&#xff0c;是否感到一丝遗憾&#xff1f;现在&#xff0c;是时候告别这种烦恼了&#xff01;分享五种功能强大、操作简便的MP3转换器&#xff0c;从此音频转换不发愁&#xff01…

MySQL字符集的转换

背景介绍 在使用MySQL过程中&#xff0c;如果字符集配置不当&#xff0c;可能会出现插入失败、数据乱码、 索引失效、数据丢失、查询不到期望结果等一系列使用异常的情况。因此&#xff0c;熟练掌握MySQL字符集和比较规则的配置方法&#xff0c;并在此基础上了解MySQL字符集与…

AI编程的特点及SCSAI平台在AI编程方面的一些思路

团长团 AI智造AI编程 2024年09月18日 18:25 北京 说先来看看AI编程的优缺点&#xff0c;然后我们再看看SCSAI在AI编程方面的一些可能选择 使用AI编程的优点 ‌AI编程的优点包括提升编程效率、降低编程门槛、优化程序结构、加强软件可靠性、促进跨领域融合&#xff0c;而缺点则…

龙海家园的免费停车点探寻

​第一次去龙海家园就把我羡慕到了&#xff0c;楼下就是鲤鱼门地铁&#xff0c;龙海家园底商的餐饮好吃又实惠&#xff0c;还有特别多的超市&#xff0c;空中花园也很大&#xff0c;还可以共享前海基金小镇的花园环境。虽然我看到很多车排队等进龙海家园&#xff0c;但是我还是…

红帽 Quay- 配置镜像代理缓存

《OpenShift / RHEL / DevSecOps 汇总目录》 说明&#xff1a;本文已经在 Quay 3.12 环境中验证 说明&#xff1a;可先根据《红帽 Quay - 安装篇》完成 Quay 安装。 镜像代理缓存功能 Quay 的镜像代理缓存功能可以将用户拉取的远程镜像保存到本地 Quay 的 proxy cache 中&am…

阿里巴巴搜索API返回值:电商市场竞争的新武器含

阿里巴巴搜索API返回值在电商市场竞争中扮演着至关重要的角色&#xff0c;它为企业提供了深入了解市场、分析竞争对手的宝贵资源。以下是对阿里巴巴搜索API返回值及其在电商市场竞争中应用的详细解析&#xff0c;并附上示例代码。 一、阿里巴巴搜索API返回值概述 阿里巴巴搜索…

微波无源器件 功分器3 一种用于多端口辐射单元的紧凑四路双极化正交模功分器的设计

摘要&#xff1a; 一种有着双极化能力并且能作为一个Fabry-Perot谐振腔天线的馈源包含四个输入端口的新型紧凑功分器的概念和设计被提出了。在四个圆波导中的双同相极化通过使用四个5端口十字转门结合两个8by1&#xff08;八合一&#xff09; 功分网络。功分器末端接了两个端口…

排序----数据结构

Comparable Integer Double 默认情况下都是按照升序排列的 string 按照字母再ASCII码表中对应的数字升序进行排列 冒泡排序 时间复杂度O(x^2) 选择排序 时间复杂度O(x^2) 插入排序 时间复杂度O(x^2) 希尔排序 时间复杂度O(x) 归并排序 时间复杂度O(nlogn) 快速排序

一文搞定WeakHashMap

写在前面 在缓存场景下&#xff0c;由于内存是有限的&#xff0c;不能缓存所有对象&#xff0c;因此就需要一定的删除机制&#xff0c;淘汰掉一些对象。这个时候可能很快就想到了各种Cache数据过期策略&#xff0c;目前也有一些优秀的包提供了功能丰富的Cache&#xff0c;比如…

Pandas的入门操作-Series对象

Pandas的数据结构 Series对象 class pandas.Series(dataNone, indexNone) data参数 含义&#xff1a;data是Series构造函数中最主要的参数&#xff0c;它用来指定要存储在Series中的数据。 数据类型&#xff1a;data可以是多种数据类型&#xff0c;例如&#xff1a; Python 列…

JAVA基础,利用for循环找水仙花个数

public class learn2 {public static void main(String[] args) {int count 0;//定义水仙花的个数for (int i 100; i<999; i){int g i%10;int s i/10%10;int b i/100%10;if (i b*b*b s*s*s g*g*g){count1;System.out.println(i);}}System.out.println("一共有"…

LeetCode-137. 只出现一次的数字 II【位运算 数组】

LeetCode-137. 只出现一次的数字 II【位运算 数组】 题目描述&#xff1a;解题思路一&#xff1a;解题思路二&#xff1a;符号位一起判断。背诵版解题思路三&#xff1a;0 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;除某个元素仅出现 一次 外&#xff0c;其余每…

渗透测试综合靶场 DC-2 通关详解

一、准备阶段 准备工具如Kali Linux&#xff0c;下载并设置DC-2靶场机。确保攻击机和靶机在同一网络段&#xff0c;通常设置为桥接模式或NAT模式。 1.1 靶机描述 Much like DC-1, DC-2 is another purposely built vulnerable lab for the purpose of gaining experience in …

GIS OGC之WMTS地图服务,通过Capabilities XML描述文档,获取matrixIds,origin,计算resolutions

GIS OGC之WMTS地图服务&#xff0c;通过Capabilities XML描述文档&#xff0c;获取matrixIds&#xff0c;origin&#xff0c;计算resolutions 需求&#xff1a;如何根据WMTS服务的Capabilities描述文档得到&#xff0c;openlayers调用wmts服务时的matrixIds&#xff0c;origin…

spring security 手机号 短信验证码认证、验证码认证 替换默认的用户名密码认证132

spring security内置的有用户名密码认证规则&#xff0c;还可以调用第三方微信、qq登录接口实现登录认证&#xff0c;这里使用自定义的手机号和短信验证码实现登录认证。 要实现自定义的手机号和短信验证码认证需要了解用户名密码认证的逻辑&#xff0c;仿照该逻辑就可以写出…

心觉:成功学就像一把刀,有什么作用关键在于使用者(一)

Hi&#xff0c;我是心觉&#xff0c;与你一起玩转潜意识、脑波音乐和吸引力法则&#xff0c;轻松掌控自己的人生&#xff01; 挑战每日一省写作173/1000天 很多人觉得成功学是鸡汤&#xff0c;是没用的&#xff0c;甚至是骗人的 我先保持中立&#xff0c;不知道对不对 我们先…

实习项目|苍穹外卖|day11

Apache ECharts 前端技术。 营业额统计 还是比较简单的。 用户统计 订单统计 以上所有需求。难点在于对时间类的处理&#xff1a; // 接收格式 GetMapping("/turnoverStatistics")ApiOperation("营业额统计")public Result<TurnoverReportVO>…

游戏开发引擎__游戏场景(灯光,摄像机)

1.灯光 重要参数介绍 类型: 控制灯光的类型&#xff0c;有“定向”“点”“区域”和“聚光”4种模式。颜色: 控制灯光的颜色。模式: 控制灯光的光照模式&#xff0c;有“实时”“混合”和“烘焙”3种模式。强度: 控制灯光的明亮程度。间接乘数: 改变间接光的强度。阴影类型: …

使用梯度下降法实现多项式回归

原文链接:使用梯度下降法实现多项式回归 - 柒墨轩 - 博客园 使用梯度下降法实现多项式回归 实验目的 本实验旨在通过梯度下降法实现多项式回归,探究不同阶数的多项式模型对同一组数据的拟合效果,并分析样本数量对模型拟合结果的影响。 实验材料与方法 数据准备 生成训练…