PIMP(指针成员指向实现,接口与实现分离)和NVI(非虚拟接口,私有虚函数)都是为了将不变的代码控制,需要变化的部分单独用一个函数包裹起来,PIMPL使用的委托,不过NVI使用的继承而已。

从设计模式上来讲,PIMP使用的策略模式,NVI使用的则是模板模式。

下面的Dowork() 具体工作,在不同的继承类中细化,可以是变化的,不过控制代码是不变的,这样即使Dowork()  需要修改,Base类却不需要编译,基类拥有控制权.

虚函数是动态绑定的,所以只要不是在类外部调用虚函数,仅类内部调用虚函数无所谓访问控制,最终调用的都是派生类的虚函数。

class Base
{
public :void Work(void){... // <-此处可以加入控制代码DoWork();... // <-此处可以加入控制代码}    private:virtual void DoWork(void) = 0;
};

B即使需要修改,只要B的共有接口不变,pimpl总是个指针,对A 的布局不会发生影响,所以A自身不需要修改,使用A的类也不需要发生修改,也就不需要重新编译:

class A
{
public:void func(){//此处加入不变的控制代码pimpl->func();//此处加入不变的控制代码}
private:B* pimpl;
};

这样降低了耦合,也实现了信息的隐藏。

C++中的PIMPL和NVI相关推荐

  1. C++开发中的pImpl方法

    PImpl(private implementation) 其主要作用是解开类的使用接口和实现的耦合.pImpl方法是微软的Herb Sutter提出来的,该方法是为了尽量减小接口和实现之间的耦合,以 ...

  2. 设计模式之Pimpl模式

    Pimpl(pointer to implementation, 指向实现的指针)是一种常用的,用来对"类的接口与实现"进行解耦的方法.这个技巧可以避免在头文件中暴露私有细节(见下 ...

  3. C++必知必会RALL与Pimpl

    系列文章目录 第一章 C++必知必会 第二章 C++后端开发必备的工具和调试知识 第三章 多线程编程与资源同步 第四章 网络编程重难点解析 第五章 网络通信故障排除常用命令 第六章 网络通信协议设计 ...

  4. GNU Make 使用手册(于凤昌中译版)

    GNU Make 使用手册(中译版) 翻译:于凤昌 GNU make Version 3.79 April 2000 Richard M. Stallman and Roland McGrath 1 ...

  5. Exceptional C++ 读书笔记

    Exceptional C++ 读书笔记 1 泛型程序设计与C++标准库(没看)  Item 1 Iterator: 1)注意当前迭代器是否有效,如果无效则解引用产生程序错误: 2)注意当前迭代器生命 ...

  6. EffectiveC++

    一.让自己习惯C++ 条款02:尽量以const,enum,inline替换#define 条款03:尽可能使用const 二.构造/析构/赋值运算 条款04:确定对象被使用前已先被初始化 条款05: ...

  7. C++ API设计笔记

    <C++ API设计>原英文版由Martin Reddy著,中文版出版于2013年,这里是中文版的笔记. 1. API简介 1.1 什么是API:API(Application Progr ...

  8. 《Effective Modern C++》笔记

    文章目录 绪论 第1章 型别推导 条款1:理解模板类型推导 情况1:ParamType 是个指针或引用,但不是万能引用 情况2:ParamType是万能引用 情况3:ParamType既非指针也非引用 ...

  9. C++ API 设计 章节链接

    http://www.aiuxian.com/article/p-1301505.html 第三章 模式 前一章所讨论的品质是用来区分设计良好和糟糕的API.在接下来的几个章节将重点关注构建高品质的A ...

  10. C++ API 设计 08 第三章 模式

    第三章 模式 前一章所讨论的品质是用来区分设计良好和糟糕的API.在接下来的几个章节将重点关注构建高品质的API的技术和原则.这个特殊的章节将涵盖一些有用的设计模式和C++ API设计的相关习惯用法. ...

最新文章

  1. Atitit 图像处理类库安装与安装模式的前世今生与未来大趋势attilax总结.docx
  2. 重写equals和hashCode
  3. 贵州大学开题报告计算机,贵州大学毕业论文开题报告.docx
  4. 汇编 --- 初体验
  5. preserve log什么意思_一些有意思的JavaScript代码片段
  6. 安装SQL2005提示“SQL Server 2005 COM+ 目录要求”警告 解决方法
  7. Soul 网关源码阅读(一) 概览
  8. 局域网计算机如何传输文件,局域网如何快速传输文件|同一个局域网传输文件的方法...
  9. VBA学习笔记4:将同一文件下的多个工作簿的数据汇总为一个工作表
  10. HTML-embed标签详解
  11. 各类排序算法汇总及动画演示(C语言)
  12. StatsD与Graphite联合作战
  13. python 基础知识点 (一)
  14. Java 统计接口消耗时间
  15. XILINX FPGA 7系之 CLB/LUT/FF/Multiplexers
  16. 计算空间中两线段之间的距离
  17. SpringBoot 中新建一个Controller类,提示从未使用过的解决方法
  18. 中国的市场营销部到底是怎么分工的,每个人到底在干什么事?
  19. 模电课程设计——信号发生器
  20. ladp3 获取属性_ldap3库:用多个值修改属性

热门文章

  1. 树莓派各类显示屏体验
  2. 将win7笔记本电脑变身WiFi热点,让手机、笔记本共享上网
  3. Logstash的filter插件-Dissect
  4. 输入一个数,判断它是否是素数,如果是素数输出yes,否则输出no
  5. Spark - RangePartitioner rangeBounds 生成 源码分析 实践
  6. 【密码科普】第7期 - 凯撒密码与密码机
  7. 深度学习基础6(微分,偏导,梯度,链式法则)
  8. GPT-3写了一篇论文
  9. Android数据持久化存储(一)
  10. 供应链金融的三种业务模式