前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Effective C++ 35:考虑虚函数的其他替代设计

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

作者头像
程序员小王
发布2019-05-05 16:35:14
8170
发布2019-05-05 16:35:14
举报
文章被收录于专栏:架构说架构说

Item 35: Consider alternatives to virtual functions.

背景知识准备1

  1. 准备周期:阅读三周
  2. STL源码剖析 笔记
代码语言:javascript
复制
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。

代码语言:javascript
复制
// 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++对象模型>> 输出:
代码语言:javascript
复制
https://github.com/wangcy6/weekly/tree/master/reading-notes/object-model

目录

  • 最重要的一个知识点

类内存布局

image.png

  • 几个问题

几个问题

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

代码语言:javascript
复制
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);
    }
};

测试代码:

代码语言:javascript
复制
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相比虚函数的实现在性能上并不占优,

  • 最大的优点是大大降低类之间的耦合度,
  • 缺点是太过于松散导致代码的内聚性和可读性降低。
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Offer多多 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景知识准备1
  • 3. 重要一个知识点:函数对象 == lambda表达式
  • 背景知识准备2-深度探索C++对象模型
  • 2. std:bind+std:function取代虚函数
  • 对比: function模板类和bind模板函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档