10.9.2 std::function 非OO的多态实现 Page185~187

news2024/11/18 23:23:49

源代码:

#include <iostream>
#include <functional>
#include <list>

using namespace std;

//使用function模板类定义一个类型,
//该类型要求作为T的
//函数类型是参数是string,返回值是void
typedef std::function <void (std::string)>
                            IntroductionFunction;

struct Person
{
    //参数是一个IntroductionFunction类型的对象引用
    Person(IntroductionFunction& f)
        : _introduction(f)
    {
    }

    void Introduction(std::string const& name) const
    {
        this->_introduction(name);
    }

private:
    //成员是一个IntroductionFunction类型的对象
    IntroductionFunction _introduction;
};

//普通人的介绍
//函数类型是参数是string,返回值是void,
//可用来构造IntroductionFunction类型的对象
void NormalIntroduction(std::string const& name)
{
    cout << "我是:" << name << endl;
}

//美女的介绍
//参数是string,返回值是void,
//可用来构造IntroductionFunction类型的对象
void BeautyIntroduction(std::string const& name)
{
    cout << "我是大美女:" << name << endl;
}

///超级大美女的介绍
struct SuperBeautyIntroduction
{
    SuperBeautyIntroduction()
        : _count(0)
    {

    }
    //重载(),参数是string,这样SuperBeautyIntroduction的对象
    //可以作为函数对象使用,函数类型是void (std::string),
    //所以SuperBeautyIntroduction的对象也可以用来构造
    //IntroductionFunction对象
    void operator () (std::string const& name)
    {
        if(_count < 1)
        {
            BeautyIntroduction(name);
        }
        else
        {
            cout << "你们这些媒体烦不烦嘛,我这都第"
                 << _count + 1 << "次自我介绍了!" << endl;
        }

        ++ _count;
    }
private:
    int _count;//介绍次数
};

void test()
{
    /* IntroductionFunction是std::function <void (std::string)>类型,
    NormalIntroduction是void (std::string)类型的函数
    所以n_introduce实际上是以NormalIntroduction为参数构造出来的一个对象*/

    //以普通人自我介绍的方式构造一个对象
    //使用NormalIntroduction作为参数构造一个IntroductionFunction对象n_introduce
    IntroductionFunction n_introduce(NormalIntroduction);
    //使用对象n_introduce构造一个Person对象
    Person p1(n_introduce); ///构造一个普通人对象
    p1.Introduction("李师师"); ///普通人开始介绍自己
    p1.Introduction("李师师");
    //使用BeautyIntroduction作为参数构造一个IntroductionFunction对象b_introduce
    IntroductionFunction b_introduce(BeautyIntroduction);
    Person p2(b_introduce); ///构造一个美女对象
    p2.Introduction("王熙凤");
    p2.Introduction("王熙凤");
    //sb是个函数对象,函数类型是void (std::string)
    SuperBeautyIntroduction sb; ///一个超级大美女对象
    IntroductionFunction sb_introduce(sb); ///sb是个函数对象
    Person p3(sb_introduce);
    p3.Introduction("凤姐");
    p3.Introduction("凤姐");

}
void demo_polymorphism_without_virtual()
{
    //list的元素类型是pair <Person, string>
    std::list <std::pair <Person, std::string>> lst;
    /**< IntroductionFunction的参数是string类型,返回值是void类型 */
    /**< IntroductionFunction是Person类的一个成员 */
    //n_introduce是个IntroductionFunction类型的函数
    /**< 相当于IntroductionFunction n_introduce = NormalIntroduction */
    IntroductionFunction n_introduce(NormalIntroduction);
    /**< 相当于IntroductionFunction b_introduce = BeautyIntroduction; */
    IntroductionFunction b_introduce(BeautyIntroduction);

    SuperBeautyIntroduction sb;  //一个超级大美女对象
    IntroductionFunction sb_introduce(sb); ///这里不用ref, 这里的sb是函数对象sb()
    /**< 将Person和名字绑定到一起构成一个pair,然后存储到lst里面 */
    lst.push_back(std::make_pair(Person(n_introduce), "玫露"));
    lst.push_back(std::make_pair(Person(n_introduce), "梦露"));
    lst.push_back(std::make_pair(Person(sb_introduce), "露露"));

    for(auto it = lst.begin(); it != lst.end(); ++ it)
    {
        //每人自我介绍两次:
        it->first.Introduction(it->second);
        it->first.Introduction(it->second);
    }
}

int main()
{
    test();
    cout << "----------" << endl;
    demo_polymorphism_without_virtual();
    return 0;
}

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

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

相关文章

MySQL-多表联合查询

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…

【算法实验】实验1

实验1-1 斐波那契数 【问题描述】斐波那契数 &#xff08;通常用 F(n) 表示&#xff09;形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始&#xff0c;后面的每一项数字都是前面两项数字的和。 定义&#xff1a;F(0) 0, F(1) 1, F(n) F(n-1) F(n-2) 其中n>1 要求计…

1、计算机的硬件组成、校验码

计算机的硬件组成 CPU的组成与功能 CPU的组成 CPU主要是由运算器、控制器、寄存器组和内部总线等部件组成 CPU的功能 1、程序控制通过执行指令来控制程序的执行顺序2、操作功能一条指令的实现需要若干操作信号配合&#xff0c;控制相应的部件完成相对应的操作3、时间控制对…

idea2020.1 x64实现git的push

今天还有点时间&#xff0c;顺便写一下这个。 我这边只说一下远程仓库&#xff08;gitee&#xff09;的push 点击之后会弹出 点击&#xff0c;弹出 输入你定义的远程仓库名&#xff08;自己起&#xff09;&#xff0c;以及url&#xff0c;url由下面获取 在你的gitee创建好仓库…

Marin说PCB之传输线损耗---趋肤效应和导体损耗01

大家在做RF上的PCB走线或者是车载相机的上走线的时候经常会听那些硬件工程师们说你这个走线一定要保证50欧姆的阻抗匹配啊&#xff0c;还有就是记得加粗走做隔层参考。 有的公司的EE硬件同事会很贴心的把RF走线的注意事项给你备注在原理图上或者是layoutguide上&#xff0c;遇到…

Rust-函数

简介 Rust的函数使用关键字fn开头。 函数可以有一系列的输入参数&#xff0c;还有一个返回类型。 函数体包含一系列的语句(或者表达式)。 函数返回可以使用return语句&#xff0c;也可以使用表达式。 Rust编写的可执行程序的入口就是fn main()函数。 以下是一个函数的示例…

Puppeteer让你网页操作更简单(1)屏幕截图

网页自动化设计爬虫工具 中就使用了Puppeteer进行对网页自动化处理&#xff0c;今天就来看看它是什么东西&#xff01; 我们将学习什么? 在本教程中,您将学习如何使用JavaScript自动化和抓取 web。 为此,我们将使用Puppeteer。 Puppeteer是一个Node库API,允许我们控制无头Ch…

在Eureka中注册多个服务(根据本地主机端口号区分)

这篇文章主要介绍如何在Eureka注册中心内注册多个EurekaServer服务端 建项目 创建一个Maven项目&#xff0c;在里面创建三个小的Maven空项目&#xff0c;具体结构如下。 EurekaServer3&#xff0c;即外面的大模块&#xff0c;为了清楚的观察项目结构&#xff0c;我将其src文…

Python data Structures: Strings, Files, Lists

Python data Structures 这门课是在coursera上由美国密歇根大学开展的公开课。python零基础可以选择course1,这是course2&#xff0c;我用来复习和补充的。本章将复习字符串、文件、列表。 Python是这样的&#xff0c;没学一次都有新的发现&#xff0c;补充以前遗漏的地方。 …

助力工业园区作业违规行为检测预警,基于YOLOv7【tiny/l/x】不同系列参数模型开发构建工业园区场景下作业人员违规行为检测识别系统

在很多工业园区生产作业场景下保障合规合法进行作业生产操作&#xff0c;对于保护工人生命安全降低安全隐患有着非常重要的作用&#xff0c;但是往往在实际的作业生产中&#xff0c;因为一个安全观念的淡薄或者是粗心大意&#xff0c;对于纪律约束等意思薄弱&#xff0c;导致在…

开发er们必知的Git命令

Git和GitHub是每位软件工程师都必须了解的最基本的东西。这些工具是开发人员日常工作的组成部分,因为我们每天都要与它们进行交互。熟练掌握Git不仅能简化您的生活,还能显著提高生产力。在这篇博文中,我们将探索一组命令,这些命令将大大提高您的生产力。随着您对这些命令的掌握…

【数据结构】八大排序之计数排序算法

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 一.计数排序简介及思想 二.计数排序代码实现 三.计数排序复杂度分析 &#x1f4cc;时间复杂度 &#x1f4cc;空间复杂度 结语 一.计数排序简介及思想 计数排序(Cou…

每日一博 - 使用APIFOX调测 @RequestBody标注的对象

文章目录 概述发送 post 请求步骤1.新建接口&#xff0c;设置为 post 请求2. 填写 URL 和参数3.发送请求 实战 RequestBody 概述 APIFOX&#xff08;类似Postman&#xff09;提供了丰富的功能来支持用户发送包含各种信息的 POST 请求&#xff0c;如文本数据、JSON 或 XML 数据…

雷达截面积RCS原理浅析

Radar Cross Section 雷达截面积&#xff08;Radar Cross Section&#xff09;是雷达扫描到物体的等效可见面积。具体来讲&#xff0c;RCS是一个虚拟的平面&#xff0c;该平面可以拦截该区域覆盖范围内的全部雷达能量&#xff0c;并且以漫反射形式将能量反射给雷达。雷达接受到…

在Android原生项目中 创建 Flutter模块

前言 应用场景&#xff1a;在已有的Android原生项目中&#xff0c;引入Flutter模块&#xff0c;摸索了两天&#xff0c;终于给整出来了&#xff1b; 如果是新项目&#xff0c;最好直接创建Flutter项目&#xff0c;然后在Fluter的 android / ios目录中&#xff0c;写原生代码&…

MYSQL的事务隔离

本章概览 mysql是一个支持多引擎的系统&#xff0c;并不是所有引擎都支持事务&#xff0c;本篇以innodb为例解析mysql在事务支持的实现。提到事务一定会想到ACID(Atomicity、Consistency、Isolation、Durability&#xff0c;即原子性、一致性、隔离性、持久性)&#xff0c;今天…

非线性方程求根迭代法(C++)

文章目录 问题描述算法描述不动点迭代法一维情形多维情形 牛顿迭代法单根情形重根情形 割线法抛物线法逆二次插值法 算法实现准备工作一般迭代法割线法抛物线法逆二次插值法 实例分析例1例2 迭代法是一种求解非线性方程根的方法, 它通过构造一个迭代过程, 将一个非线性方程转化…

智能手表喇叭无气孔导致老化播放后没声音

智能音箱喇叭老化播放后没声音 智能手表要做防水&#xff0c;在外壳上打了防水胶&#xff0c;结果出现播放突然没声音的现象&#xff0e; 原因 一直播放&#xff0c;设备温度升高&#xff0c;因为做了防水密闭导致喇叭腔体气压异常&#xff0c;导致播放没声音&#xff0e; …

SpringBoot-项目部署

SpringBoot项目部署可以通过将项目打成可执行的jar包或war包来实现&#xff0c;也可以使用容器化技术如Docker将项目部署到云平台中。在部署时需要注意配置文件的位置和启动参数的设置&#xff0c;同时确保目标环境中的Java版本与项目所需的Java版本一致。部署完成后&#xff0…

什么是 JWT -- JSON WEB TOKEN ,理论部分

什么是JWT Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准&#xff08;(RFC 7519).该token被设计为紧凑且安全的&#xff0c;特别适用于分布式站点的单点登录&#xff08;SSO&#xff09;场景。JWT的声明一般被用来在身份提供者和服务提…