专栏首页架构说Effective C++ 35:考虑虚函数的其他替代设计

Effective C++ 35:考虑虚函数的其他替代设计

Item 35: Consider alternatives to virtual functions.

背景知识准备1

  1. 准备周期:阅读三周
  2. STL源码剖析 笔记
https://github.com/wangcy6/weekly/blob/master/reading-notes/STL%E6%BA%90%E7%A0%81%E5%89%96%E6%9E%90/stl.md

3. 重要一个知识点:函数对象 == lambda表达式

小王职场记 谈谈你的STL理解(1) c++系列之二 指向成员函数的指针(烧脑)

function object

函数对象是定义了函数调用运算符的类对象,称作class type functor。

// comparator predicate: returns true if a < b, false otherwise
struct IntComparator
{
  bool operator()(const int &a, const int &b) const
  {
    return a < b;
  }
};

背景知识准备2-深度探索C++对象模型

  1. 准备时间:阅读三周
  2. <<深度探索C++对象模型>> 输出:
https://github.com/wangcy6/weekly/tree/master/reading-notes/object-model

目录

  • 最重要的一个知识点

类内存布局

image.png

  • 几个问题

几个问题

2. std:bind+std:function取代虚函数

class NewCalcuClient
{
private:
    std::function<int(int, int)> m_function;

public:
    NewCalcuClient(std::function<int(int, int)> function) : m_function(function){}

    int calculate(int x, int y)
    {
        return m_function(x, y);
    }
};

测试代码:

Minus minus;
    CalcuClient client(&minus);

    Plus plus;
    CalcuClient client2(&plus);

    int r = client.calculate(7, 4);
    int r2 = client2.calculate(7, 4);

   //bind+function
    NewCalcuClient newclient(boost::bind(&Minus::calculate, &minus, _1, _2));
    NewCalcuClient newclient2(boost::bind(&Plus::calculate, &plus, _1, _2));

    int r3 = newclient.calculate(7, 4);
    int r4 = newclient2.calculate(7, 4);

对比: function模板类和bind模板函数

bind+function相比虚函数的实现在性能上并不占优,

  • 最大的优点是大大降低类之间的耦合度,
  • 缺点是太过于松散导致代码的内聚性和可读性降低。

本文分享自微信公众号 - 架构说(JiaGouS),作者:程序员小王

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-03-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Leetcode 200 Number of Islands 岛的个数

    1. 遍历每一个结点,如果某结点是陆地且未访问过,岛数目加1,修改未访问标志位,然后把该点放入队列中,以备扩展岛屿使用,进入2 2. 队列不为空时,取出点,然...

    程序员小王
  • Socket基本-TCP粘包问题

    Thrift是Facebook的一个开源项目,主要是一个跨语言的服务开发框架 提供完整的解决方案 优点很多也就不说了, 但是有个缺点必须要求客户端调用采用thr...

    程序员小王
  • Effective STL(21) 永远让比较函数对相同元素返回false

    问题描述: 昨天一哥们些的程序,在定义比较函数的时候是这样写的 bool cmp(const T& a, const T& b) { if (a >=...

    程序员小王
  • 33判断字符串是否为回文

    33:判断字符串是否为回文 总时间限制: 1000ms 内存限制: 65536kB描述 输入一个字符串,输出该字符串是否回文。回文是指顺读和倒读都一样的字符串...

    attack
  • Golang实现ping

    在使用Go语言的net.Dial函数时,发送echo request报文时,不用考虑i前20个字节的ip头;但是在接收到echo response消息时,前20...

    李海彬
  • LeetCode 系列 905. 按奇偶排序数组

    905. 按奇偶排序数组: https://leetcode-cn.com/problems/sort-array-by-parity/

    村雨遥
  • 有向无环图检测

    01 — Spark背景介绍 Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎。Spark 是一种与 Hadoop 相似的开源集群计算环...

    企鹅号小编
  • 青少年编程让孩子成为创意思考者!

    现在的孩子们都能熟练地使用各种数码产品,但这能代表他们真正拥有应用新科技的能力吗?未来是一个人工智能的时代,孩子们不仅需要会使用各种软件、APP,还需要学会自己...

    企鹅号小编
  • Nodejs进阶:readline实现日志分析+简易命令行工具

    readline是个非常实用的模块。如名字所示,主要用来实现逐行读取,比如读取用户输入,或者读取文件内容。常见使用场景有下面几种,本文会逐一举例说明。本文相关代...

    IMWeb前端团队
  • 数据库 ID 生成方案:Redis

    使用 Redis 来生成分布式 ID,其实和利用 Mysql 自增 ID 类似,可以利用 Redis 中的 incr 命令来实现原子性的自增与返回,比如:

    happyJared

扫码关注云+社区

领取腾讯云代金券