首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何构建std::map到为派生类重载的函数

构建std::map到为派生类重载的函数可以通过使用函数指针或者函数对象来实现。下面是一个示例代码:

代码语言:txt
复制
#include <iostream>
#include <map>

class Base {
public:
    virtual void func() {
        std::cout << "Base::func()" << std::endl;
    }
};

class Derived1 : public Base {
public:
    void func() override {
        std::cout << "Derived1::func()" << std::endl;
    }
};

class Derived2 : public Base {
public:
    void func() override {
        std::cout << "Derived2::func()" << std::endl;
    }
};

int main() {
    std::map<int, void(*)()> funcMap;

    // 添加派生类的函数到map中
    funcMap[1] = []() { Derived1 d1; d1.func(); };
    funcMap[2] = []() { Derived2 d2; d2.func(); };

    // 调用map中的函数
    if (funcMap.find(1) != funcMap.end()) {
        funcMap[1]();
    }

    if (funcMap.find(2) != funcMap.end()) {
        funcMap[2]();
    }

    return 0;
}

在上述示例中,我们使用了std::map来存储函数指针,键为整数,值为指向函数的指针。我们将派生类的函数通过lambda表达式的方式添加到map中,并在需要调用时通过键值来执行相应的函数。

这种方法的优势是可以根据需要动态地添加、删除和修改函数,同时可以根据不同的键值调用不同的函数。这在一些需要根据条件选择不同函数执行的场景中非常有用。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云函数计算(SCF):https://cloud.tencent.com/product/scf
  • 腾讯云云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 腾讯云数据库(TencentDB):https://cloud.tencent.com/product/cdb
  • 腾讯云人工智能(AI):https://cloud.tencent.com/product/ai
  • 腾讯云物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 腾讯云移动开发(移动推送、移动分析、移动测试等):https://cloud.tencent.com/product/mobile
  • 腾讯云对象存储(COS):https://cloud.tencent.com/product/cos
  • 腾讯云区块链(BCS):https://cloud.tencent.com/product/bcs
  • 腾讯云虚拟专用网络(VPC):https://cloud.tencent.com/product/vpc
  • 腾讯云安全产品(WAF、DDoS防护等):https://cloud.tencent.com/product/security
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

读完某C++神作,我只记下了100句话

map函数大部分都有对应。 关联容器:容器元素根据键次序排列。 map可以理解关联数组,键就是下标。 map可以用迭代器遍历,按键排序。...如果知道基类派生类转换【这种转换是基类地址赋给派生类指针】是安全【就是说心里清楚基类指针指向的确实是派生类】,可以使用static_cast强制编译器进行转换。...派生类指针静态类型和动态类型不一致时【基类指针指向派生类是时】,保证删除指针调用合适析构函数【多态】,基类析构必须virtual。...局部作用域中声明函数不会重载全局域函数派生类定义函数也不重载基类函数【想重载要么不定义,要么全定义】。using作用域。...纯虚函数==抽象类==无法创建对象 派生类对象复制基类时派生类对象将被切掉【而指针和引用不会】。

1.4K20

60秒问答:多态和函数重载关系?

重写 不用作用域 , 函数名字相同,参数相同。 隐藏:不用作用域, 通过派生类访问:派生类同名函数,隐藏基类函数 或者通过基类指针访问,基类函数隐藏派生类。 二、 问题:如何解隐藏问题?...编译时多态:函数重载和运算符重载(根据参数不同选择具体函数 ) 运行时多态:通过类继承和虚函数实现(根据虚表指针 指向 派生类函数,还是基类函数) 四、 类型转换有几种情况,有什么区别?...三、如何将隐藏行为覆盖掉 情况1 如果是通过派生类访问一个函数派生类局部作用域隐藏上层 base类函数 为了让隐藏起来名字重见天日,使用using声明 通过base类指针或者引用访问 (这个和虚函数无关...3.1 C++核心准则C.138:使用using派生类生成重载函数集 C.138: Create an overload set for a derived class and its bases...隐藏:不用作用域, 通过派生类访问:派生类同名函数,隐藏基类函数 或者通过基类指针访问,基类函数隐藏派生类。 二、 问题:如何解隐藏问题?

1.3K10

封装、继承、多态、重载:C++中强大特性与代码设计

继承可以通过创建一个新类并从基类派生来实现,新类将自动获得基类成员变量和成员函数,同时可以添加新成员或重写基类成员函数。 继承主要目的是实现代码重用和构建类之间层次关系。...实质:用已有的数据类型创建新数据类型,并保留已有数据类型特点,以旧类基础创建新类,新类包含旧类数据成员和成员函数。并且·可以在新类中添加新数据成员和成员函数。...通过函数重载,可以根据参数类型、顺序和个数来区分不同函数,并且可以为相同操作提供不同实现。 函数重载特点如下: 函数名称相同:重载函数必须具有相同名称。...函数重载允许我们使用相同函数名,但根据参数类型、顺序和个数来区分不同函数。这样,我们可以提供不同函数实现来处理各种情况,而无需每种情况编写不同函数名称。...总而言之,函数重载是C++中一个强大特性,可以使代码更加灵活和易于使用,我们提供了更多选择和可能性。合理地利用函数重载,可以使我们代码更加清晰、高效,同时提高开发效率和代码可维护性。

30510

两万字总结《C++ Primer》要点

返回e (4)map下标操作 map和unorder_map下标操作 c[k] 返回关键字k元素;如果k不在c中,添加一个关键字k元素,对其进行值初始化 c.at[k] 访问关键字k元素...} 在一个析构函数中,不存在类似构造函数中初始化列表东西来控制成员如何销毁,析构部分是隐式。销毁类类型成员需要执行成员自己析构函数。...重载运算符包含返回类型、参数列表和函数体。 ::: tip 当一个重载运算符是成员函数时,this绑定左侧运算对象。成员运算符函数显式参数数量比运算对象数量少一个。...P527 ::: 15.2 定义基类和派生类 (1)定义基类 虚函数:基类希望派生类进行覆盖函数。 基类将该函数定义函数(virtual)。...派生类对象: 一个派生类对象包含多个部分:自己定义成员子对象,以及基类子对象。 派生基类类型转换: 由于派生类对象中含有与其基类对象组成部分,因此可以进行隐式执行派生类基类转换。

1.7K30

两万字总结《C++ Primer》要点

返回e (4)map下标操作 map和unorder_map下标操作 c[k] 返回关键字k元素;如果k不在c中,添加一个关键字k元素,对其进行值初始化 c.at[k] 访问关键字k元素...} 在一个析构函数中,不存在类似构造函数中初始化列表东西来控制成员如何销毁,析构部分是隐式。销毁类类型成员需要执行成员自己析构函数。...重载运算符包含返回类型、参数列表和函数体。 ::: tip 当一个重载运算符是成员函数时,this绑定左侧运算对象。成员运算符函数显式参数数量比运算对象数量少一个。...P527 ::: 15.2 定义基类和派生类 (1)定义基类 虚函数:基类希望派生类进行覆盖函数。 基类将该函数定义函数(virtual)。...派生类对象: 一个派生类对象包含多个部分:自己定义成员子对象,以及基类子对象。 派生基类类型转换: 由于派生类对象中含有与其基类对象组成部分,因此可以进行隐式执行派生类基类转换。

1.7K20

《Effective C++》读书笔记(二):构造析构赋值运算(条款05~条款12)

对于这六大默认成员函数,详细解析在类和对象这篇博客中,我将在这里简单总结一下编译器是如何调用它们。...还有一种情况是在继承情况下,基类将自己赋值重载函数设为私有的,那么编译器就会拒绝给派生类默认生成赋值重载函数。...,只要把基类拷贝构造函数和赋值重载私有或者删掉,派生类就不可能会默认生成拷贝构造和函数重载出来!...string dog) { return dog; } int main() { Corgi co1("天天"); Corgi co2("大肥"); return 0; } 代码分析:一开始会进入派生类构造函数初始化列表中...做法就是在派生类拷贝构造函数和赋值重载中调用基类拷贝构造和赋值函数

35510

必知必会之C++多态机制

静态多态 静态多态(也称为编译时多态或早期多态)是指在编译时就确定函数调用方式,主要通过函数重载和模板来实现。...静态多态主要有两种形式: 函数重载函数重载允许在同一作用域内声明多个函数,它们具有相同名称但参数列表不同。在调用函数时,编译器根据传递参数数量、类型和顺序来选择匹配函数。...#include // 函数重载示例 void print(int x) { std::cout << "Integer: " << x << std::endl; }...通过使用模板,可以在不同类型参数上执行相同操作,而无需每种类型编写不同函数。...下面是一个简单示例说明了如何使用父类指针来指向子类对象: #include // 基类 class Base { public: virtual void display

12610

【C++】自学终极笔记

() { cout << "派生类 额外函数" << endl; } // 重载函数派生类版本 void normalFunction(double...自动调用,格式 类名 允许重载 析构函数: 没有参数 无函数类型 自动调用,格式 ~类名 不能重载 注意: C++每个类都必须要有构造函数,若用户未提供则系统提供一个默认无参构造函数【...,并在此基础上可以构建自己成员函数和数据成员。...在对象构造过程中,虚表还没有被构建,因此无法实现虚函数多态性。 析构函数应该声明为虚函数: 如果类中包含虚函数,通常应该将析构函数声明为虚函数。...这确保在使用基类指针指向派生类对象时,可以正确调用派生类析构函数,避免内存泄漏。 纯虚函数: 纯虚函数本身在基类中没有具体实现,而是在派生类中被强制要求实现。

19010

C++ 类、继承、重载《Rice C++ 学习开发》

2.基类重载运算符。 3.基类友元函数。 继承类型:当一个类派生自基类,该基类可以被继承 public、protected 或 private 几种类型。...: C++ 允许在同一作用域中某个函数和运算符指定多个定义,分别称为函数重载和运算符重载。...当您调用一个重载函数重载运算符时,编译器通过把您所使用参数类型与定义中参数类型进行比较,决定选用最合适定义。选择最合适重载函数重载运算符过程,称为重载决策。...函数重载:在同一个作用域内,可以声明几个功能类似的同名函数,但是这些同名函数形式参数(指参数个数、类型或者顺序)必须不同。您不能仅通过返回类型不同来重载函数。...return 0; } 运算符重载重载运算符是带有特殊名称函数函数名是由关键字 operator 和其后要重载运算符符号构成

63210

大学C++课程提炼概括【C++笔记】

//构造:按照分配空间顺序 //析构:按照最后全局、其次静态(static)、再其次以main函数作用域对象、再其次当前块作用域对象(补充:构造函数,静态就算在块中,如在for循环中,每一次...:"条件运算符 这五个不可重载 //重载不会改变运算符优先级 //重载双目运算符 "==" ">" "<" //要构建一个String 类,重载函数以友元函数形式出现在类中,双目符重载函数作为成员函数报错...参数表 ) =0; //在基类中派生类保留一个函数名字,以便派生类根据需要对它进行定义。...delete p;//基指针指向过基类、派生类,需要定义基类析构函数函数,否则,执行该操作后,只释放基类内存,可能会内存泄漏 } //多态性 //静态多态性:函数重载、运算符重载 //动态多态性:...但考虑各方面的因素,一般将单目运算符重载成员函数,将双目运算符重载友元函数

36570

《C++Primer》第十五章 面向对象程序设计

被调用函数是与绑定指针或引用上对象动态类型相匹配那一个。...派生类构造函数会使用Disc_quote构造函数构建各个派生类对象Disc_quote部分。...一如往常,名字查找先于类型检查 声明在内层作用域函数并不会重载声明在外层作用域函数。因此定义派生类函数也不会重载其基类成员。...覆盖重载函数 和其他函数一样,成员函数无论是否是虚函数都能被重载派生类可以覆盖重载函数0个或多个实例。...; 我们既不能移动也不能拷贝B对象,如果B派生类希望它自己对象能被移动和拷贝,则派生类需要自定义相应版本构造函数,在这一过程中派生类需要考虑如何移动或者拷贝其基类部分成员。

1.2K20

C++查缺补漏

双目运算符重载规则 如果要重载 B 类成员函数,使之能够实现表达式 oprd1 B oprd2,其中 oprd1 A 类对象,则 B 应被重载 A 类成员函数,形参类型应该是 oprd2 所属类型...U 应被重载 A 类成员函数,无形参。...有些运算符不能重载成员函数,例如二元运算符左操作数不是对象,或者是不能由我们重载运算符对象 运算符重载非成员函数规则 函数形参代表依自左至右次序排列各操作数 参数个数=原操作数个数(后置...++和--重载后,表达式 oprd B等同于operator B(oprd,0 ) //重载Complex加减法和“<<”运算符非成员函数 //将+、-(双目)重载非成员函数,并将其声明为复数类友元...• 将<<(双目)重载非成员函数,并将其声明为复数类友元,它左操作数是std::ostream引用,右操作数复数类常引用,返回std::ostream引用 #include <iostream

2.5K10

C++面向对象程序设计

,每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型对象会共用一块代码 那么问题是:这一块代码是如何区分那个对象调用自己呢?...)形式可以化简A 运算符 B形式 ---- 4.5.1 加号/减号运算符重载 作用:实现两个自定义数据类型相加运算 示例1 //成员函数实现 + / -号运算符重载 #include <stdio.h...这个时候我们就可以考虑利用继承技术,减少重复代码 定义和概念 继承是类重要特性。A类继承B类,我们称B类“基类”,A派生类”。...---- 4.6.6 继承同名成员处理方式 ---- 问题:当派生类与基类出现同名成员,如何通过派生类对象,访问到派生类或基类中同名数据呢?...---- 4.6.7 继承同名静态成员处理方式 ---- 问题:继承中同名静态成员在派生类对象上如何进行访问?

39850

C++面向对象程序设计

,每一个非静态成员函数只会诞生一份函数实例,也就是说多个同类型对象会共用一块代码 那么问题是:这一块代码是如何区分那个对象调用自己呢?...)形式可以化简A 运算符 B形式 ---- 4.5.1 加号/减号运算符重载 作用:实现两个自定义数据类型相加运算 示例1 //成员函数实现 + / -号运算符重载 #include <stdio.h...这个时候我们就可以考虑利用继承技术,减少重复代码 定义和概念 继承是类重要特性。A类继承B类,我们称B类“基类”,A派生类”。...---- 4.6.6 继承同名成员处理方式 ---- 问题:当派生类与基类出现同名成员,如何通过派生类对象,访问到派生类或基类中同名数据呢?...---- 4.6.7 继承同名静态成员处理方式 ---- 问题:继承中同名静态成员在派生类对象上如何进行访问?

1.2K10

c++类和继承面试点25连问

派生类调用构造函数和析构函数顺序 看代码: #include using namespace std; class A { public: A() {...类成员函数重载、覆盖和隐藏区别 重载即为函数重载重载特征: 相同范围,也就是在同一个类中; 函数名字相同; 函数参数不同; virtual关键字无影响。...析构函数是否可以为虚函数?如果可以,有什么作用? 析构函数可以是虚函数,因为它是对象结束时才调用,不影响虚表构建。...因为销毁时候直接销毁基类指针,此时编译器只知道调用基类析构,并不会主动去调用派生类析构函数,所以基类析构函数虚析构函数,这样运行时程序才会去调用派生类析构函数,其实这就相当于析构函数多态,...,这很显然是不正确,因为执行类B构造函数时要执行一次类A构造函数,执行类C时候也要执行一次类A构造函数,析构函数同理,这里问题还不大,毕竟可以编译和运行。

94610

【C++进阶学习】第四弹——多态——迈向C++更深处关键一步

前言: 在前面我们已经学习了C++中继承相关知识,已经体会到C++在与C语言对比中便捷性,但是有一些问题并没有被解决,比如继承中如何使不同派生类公用基类一个函数,这就需要多态知识,而且...2.3 重载、覆盖(重写)、隐藏(重定义)对比 三、抽象类 四、总结 一、多态概念 C++中多态概念通俗来讲就是多种形态,同样东西,在不同场景下发挥着不同作用;体现在代码上其实就是同一个虚函数...3、派生类必须重写(override)基类函数派生类需要重写基类中函数,以提供特定于派生类实现。重写时,函数签名(包括返回类型、函数名和参数列表)必须与基类中函数完全匹配。...Base { public: void show() override { // 重写基类函数 std::cout << "Derived show()" << std:...2.2 override 和 final 关键字(C++11) 通过上面的限制条件,我们已经可以看出要想构成多态还是不容易,在我们平时写多态时候,经常可能因为某些小差错而导致构建失败,而这种编译错误是不会指出来

11210

再探虚函数

Q1:C++多态如何实现 静态多态: 也称为编译期间多态,编译器在编译期间完成,编译器根据函数实参类型(可能会进行隐式类型转换),可推断出要调用那个函数,如果有对应函数就调用该函数,否则出现编译错误...重载函数关键是函数参数列表——也称函数特征标。包括:函数参数数目和类型,以及参数排列顺序。所以,重载函数与返回值,参数名无关。...必须是虚函数派生类一定要重写基类中函数) ---- Q2:什么是纯虚函数,与虚函数区别 1、定义一个函数函数,不代表函数不被实现函数。...只有在基类析构函数定义函数时,调用操作符delete销毁指向对象基类指针时,才能准确调用派生类析构函数(从该级向上按序调用虚函数),才能准确销毁数据。...所以在调用基类析构函数时,派生类对象数据成员已经销毁,这个时候再调用子类函数没有任何意义。 ---- Q8:静态函数能定义函数吗?

86520

C++之面向对象三个基本特征

通过继承创建新类称为“子类”或“派生类”,被继承类称为“基类”、“父类”或“超类”。继承过程,就是从一般特殊过程。...9)从理论上说,可以将一个运算符重载执行任意操作。   ...运算符重载函数作为 类成员函数 与 友元函数(形参必须有要求) 一般将单目运算符和复合运算符重载成员函数 一般将双目运算符重载友元函数;   重载双目运算符 C++构造函数重载 在一个类中可以定义多个构造函数...以前介绍函数重载处理是同一层次上同名函数问题,而虚函数处理是不同派生层次上同名函数问题,前者是横向重载,后者可以理解纵向重载。...,则不要把它声明为虚函数;不要仅仅考虑要作为基类而把类中所有成员函数都声明为虚函数

1.1K60

领悟面向对象就离开发应用不远了(类提高)有你对面向对象所有疑问,爆肝1w字

文章目录 前言 一、面向对象 二、使用类 1.类基础使用 2.运算符重载 3.友元 1.友元函数 2.友元类 3.友元成员函数 三、类继承 基类 派生类 插个访问权限事情 2.多态 ***公有 **...2.运算符重载 首先我们明确一点,运算符重载是c++多态一种形式,我们来类比与函数重载来看:同名函数来完成相同基本操作,即使被利用与不同数据类型,运算符重载也差不多 例如:运算符“ * ”一样在指针中用来解引用...,但是它还是乘法运算符 再看如何定义一个自己重载运算符 operator+()重载+运算符 返回值类型 operator 运算符(形参表) { .... } 实例: #include <iostream...4.动态与静态联编 联编:将源代码中函数调用解释执行特定函数代码块被称为函数名联编,因为有个函数重载,所以还比较复杂,此刻编译器查看参数及函数名,在编译过程中联编称为静态联编,当出现虚函数时...C++中一般情况下联编是静态联编,但是当涉及多态性和虚函数时应该使用动态联编。动态联编优点是灵活性强,但效率低。

51820
领券