c++之NVI手法
non-virtual interface(NVI)手法:令用户通过public non-virtual成员函数间接调用private virtual函数,将这个non-virtual函数称为virtual函数的wrapper.wrapper确保得以在一个virtual函数被调用之前设定好适当场景,并在调用结束之后清理场景.注意此时用指针或引用调用该non-virtual成员函数时,该non-virtual成员函数调用的virtual函数取决于指针或引用的动态类型,即存在多态
- enum ShapeColor { Red, Green, Blue };
- class Shape
- {
- public:
- void draw(ShapeColor color = Red) const
- {
- doDraw(color);
- }
- private:
- virtual void doDraw(ShapeColor color) const = ;
- };
- class Rectangle :public Shape
- {
- public:
- private:
- virtual void doDraw(ShapeColor color) const;
- };
- void Rectangle::doDraw(ShapeColor color) const
- {
- cout << "Rectangle's doDraw" << "color= " << color << endl;
- }
- void main()
- {
- Shape*p = new Rectangle;
- ////输出:Rectangle's doDrawcolor= 0
- p->draw();
- system("pause");
- }
- enum ShapeColor { Red, Green, Blue };
- class Shape
- {
- public:
- void draw(ShapeColor color = Red)const
- {
- doDraw(color);
- }
- private:
- virtual void doDraw(ShapeColor color) const
- {
- cout << "Shape's doDraw" << "color= " << color << endl;
- }
- };
- class Rectangle :public Shape
- {
- public:
- private:
- virtual void doDraw(ShapeColor color) const;
- };
- void Rectangle::doDraw(ShapeColor color) const
- {
- cout << "Rectangle's doDraw" << "color= " << color << endl;
- }
- /*
- 输出:
- Shape's doDrawcolor= 0
- Rectangle's doDrawcolor= 0
- */
- void main()
- {
- Shape*p = new Shape;
- p->draw();
- delete p;
- p = NULL;
- Shape*q = new Rectangle;
- q->draw();
- delete q;
- q = NULL;
- system("pause");
- }
- enum ShapeColor { Red, Green, Blue };
- class Shape
- {
- public:
- void draw(ShapeColor color = Red)const
- {
- doDraw(color);
- }
- private:
- void doDraw(ShapeColor color) const
- {
- cout << "Shape's doDraw" << "color= " << color << endl;
- }
- };
- class Rectangle :public Shape
- {
- public:
- private:
- void doDraw(ShapeColor color) const;
- };
- void Rectangle::doDraw(ShapeColor color) const
- {
- cout << "Rectangle's doDraw" << "color= " << color << endl;
- }
- /*
- 输出:
- Shape's doDrawcolor= 0
- Shape's doDrawcolor= 0
- */
- int main()
- {
- Shape*p = new Shape;
- p->draw();
- delete p;
- p = NULL;
- Shape*q = new Rectangle;
- q->draw();
- delete q;
- q = NULL;
- system("pause");
- return ;
- }
c++之NVI手法的更多相关文章
- Effective C++ -----条款35:考虑virtual函数以外的其他选择
virtual函数的替代方案包括NVI手法及Strategy设计模式的多种手法.NVI手法自身是一个特殊形式的Template Method设计模式. 将机能从成员函数移到class外部函数,带来的一 ...
- Effective C++ 的55个条款
看完Effective C++才觉得平时程序设计时需要注意的一些问题,有一定的收获,不过因为没什么项目实践, 并未很深入了解具体情况如何,还需后继实践~ 列举一下55个条款: 1. 视C++为一个语言 ...
- 考虑virtual函数以外的其它选择
详情见<Effective C++>item35 1.使用non-virtual interface(NVI)手法,这是Template Method设计模式的一种特殊形式. 它以publ ...
- Effective C++ 总结(三)
五.实现 条款26:尽可能延后变量定义式的出现时间 如果你定义了一个变量且该类型带一个构造函数或析构函数,当程序到达该变量时,你要承受构造成本,而离开作用域时,你要承受析构成本.为了减少这个成本,最 ...
- Effective C++:条款35:考虑virtual函数以外的其它选择
游戏中的人物伤害值计算问题. (一)方法(1):一般来讲能够使用虚函数的方法: class GameCharacter { public: virtual int healthValue() cons ...
- Effective C++笔记 55条编程法则
1. 视C++为一个语言联邦 C++高效编程守则视状况而变化,取决于你使用C++的哪一部分. 2. 尽量以const,enum.inline替代#define 1) 对于单纯常量,最好以const ...
- EC读书笔记系列之16:条款35、36、37、38、39、40
条款35 考虑virtual函数以外的其他选择 记住: ★virtual函数的替代方案包括NVI手法及Strategy模式的多种形式.NVI手法自身是一个特殊形式的Template Method模式 ...
- Effective C++:条款37:绝不又一次定义继承而来的缺省參数值
因为又一次定义继承而来的non-virtual函数是不对的(见上一个条款),所以这个条款就将问题局限于:绝不又一次定义继承一个带有缺省參数值的virtual函数. (一) virtual函数是动态绑定 ...
- EffectiveC++ 第6章 继承与面向对象设计
我根据自己的理解,对原文的精华部分进行了提炼,并在一些难以理解的地方加上了自己的"可能比较准确"的「翻译」. Chapter 6 继承与面向对象设计 Inheritance and ...
随机推荐
- 常用的-->查找算法与排序算法
顺序查找 从列表第一个元素开始,顺序进行搜索,直到找到为止. 二分查找 从有序列表的候选区data[0:n]开始,通过对待查找的值与候选区中间值的比较,可以使候选区减少一半. li = [1, 2, ...
- Unexpected Exception caught setting 'username' on 'class com.bj186.crm.web.action.UserAction: Error setting expression 'username' with value ['艾格尼丝', ]
问题场景: 在使用表单向Action传递数据的时候, 遇到了这个问题, 导致了空指针异常. 问题描述: 10:14:56.622 [http-nio-8080-exec-45] ERROR com.o ...
- 【php】查看扩展的版本
php --ri [扩展名称] 例如: php --ri mongodb mongodb MongoDB support => enabled MongoDB extension version ...
- lspci详解分析
lspci详解分析 一.PCI简介 PCI是一种外设总线规范.我们先来看一下什么是总线:总线是一种传输信号的路径或信道.典型情况是,总线是连接于一个或多个导体的电气连线,总 线上连接的所有设备可在同一 ...
- oracle 存储过程,存储函数,包,
http://heisetoufa.iteye.com/blog/366957 认识存储过程和函数 存储过程和函数也是一种PL/SQL块,是存入数据库的PL/SQL块.但存储过程和函数不同于已经介绍过 ...
- PyTorch的十七个损失函数
本文截取自<PyTorch 模型训练实用教程>,获取全文pdf请点击: tensor-yu/PyTorch_Tutorialgithub.com 版权声明:本文为博主原创文章,转载请附上 ...
- [LOJ] 分块九题 4
https://loj.ac/problem/6280 区间修改,区间求和. 本来线段树的活. //Stay foolish,stay hungry,stay young,stay simple #i ...
- thinkphp5实现文件上传
原理:通过form表单的enctype = "multipart / form-data"属性将文件临时放在htdocs文件夹的tmp目录下,再通过后台的程序将文件保存在自己设定的 ...
- Linux硬盘的检测--smartctl详细介绍
概述 随着硬盘容量.速度的快速发展,硬盘的可靠性问题越来越重要,今天的单块硬盘存储容量可轻松达到1TB,硬盘损坏带来的影响非常巨大.不同的文件系统(xfs,reiserfs,ext3)都有自己的检测 ...
- idea 设置系列 各种乱码
http://blog.csdn.net/u013361445/article/details/51113692 把idea设置的好,才能用的好.