`
kuwoleft
  • 浏览: 1078711 次
文章分类
社区版块
存档分类
最新评论

考虑virtual函数之外的其他选择——effective c++学习笔记

 
阅读更多

这篇文章围绕这个一个简单的问题:

为游戏的人物设定一个继承体系,人物的健康状态可能会发生变化,则需要为人物计算他们的健康指数:

最明白的一个方案是将创建一个virtual 函数int healthValue(),用来计算健康指数。

下面的其他的替代方案:

<!--[if !supportLists]-->1、 <!--[endif]-->no-virtual interface 手法实现的template method模式

healthValue仍然为public接口。当却不再是virtual。然后它调用privateprotected virtual函数dohealthValue()derived classes继承并实现这个函数。

也就是:以public no-virtual函数包裹较低访问性(privateprotected)的virtual函数。

这个方案的优点是能够在dohealthValue()之前和之后进行一些操作。

<!--[if !supportLists]-->2、 <!--[endif]-->Function Pointer 实现的Strategy模式

通过构造函数传入一个计算健康指数函数的指针,计算时直接调用这个函数。

优点:

<!--[if !supportLists]-->1) <!--[endif]-->同一类型的不同的人可以有不同的健康计算函数。

<!--[if !supportLists]-->2) <!--[endif]-->可以在运行期更改健康计算函数。

缺点:继承体系外部的函数无法访问内部成员。解决这个问题可能会降低类的封装性。

<!--[if !supportLists]-->3、 <!--[endif]-->tr1::funtion完成strategy模式

tr1::funtion可以包括任何可调用物:函数指针,函数对象,成员函数指针。在调用时,它也会完成隐式的类型转换。

这样,它带来的灵活性就是可以接受与目标签名式兼容的可调用物。

对于成员函数指针,往往多需要输入一个参数:this指针。可以通过tr1::bind函数来将转化为和签名式兼容的类型。

这个方案其实有点复杂,而且包含了隐式类型转换。

<!--[if !supportLists]-->4、 <!--[endif]-->古典的strategy模式

分离另一个继承体系:dohealthValueFun,这个体系和人物体系存在对于关系。

优点是熟悉设计模式的人都比较容易识别,而且很容易添加健康算法。

分享到:
评论

相关推荐

    Effective C++ 中文版

    条款35:考虚virtual函数以外的其他选择 条款36:绝不重新定义继承而来的non-virtual函数 条款37:绝不重新定义继承而来的缺省参数值 条款38:通过复合塑模出has-a或“根据某物实现出” 条款39:明智而审慎地...

    More Effective C++.pdf

    某些小范围主题诸如「在base classes 中使用virtual destructor」、「令operator= 传回*this 的reference」,可能在百科型C++ 语言书籍中亦曾概略提过,但此类书籍以深度探索的方式,让我们了解问题背後的成因、最佳...

    More Effective C++

    和其前一本兄弟书籍 Effective C++一样,More Effective C++对每一位以C++为开发工具的程序员而言,都必备读物。  继 Effective C++ 之後,Scott Meyers 於 1996 推出这本「续集」。条款变得比较少,页数倒是多了...

    More Effective C++中文版

     全面地描述了C++专家所使用的高级技术,包括placement new、virtual constructors、smart pointers、reference counting、proxy classes和double-dispatching等。  以实例说明异常处理带给C++类和函数的冲击。  ...

    More Effective C++中文pdf

    继 Effective C++ 之後,Scott Meyers 於 1996 推出这本「续集」。条款变得比较少,页数倒是多了一些,原因是这次选材比「第一集」更高阶,尤其是第五章。Meyers 将此章命名为技术(Techniques),并明白告诉你,...

    EFFECTIVE c++ 第二版

    (譯註:為了協助讀者更容易掌握 Effective C++ 和More Effective C++ 二書,我以Effective C++ CD 為本,為兩書的中文版額外加上兩書之間的交叉索引。此乃原書所無。如果文中出現像條款 M5 這樣的參考指示,M 便是...

    C++析构函数使用virtual的原因

    C++析构函数使用virtual的原因

    more effective c++

    , 全面地描述了C++专家所使用的高级技术,包括placement new、virtual constructors、smart pointers、reference counting、proxy classes和double-dispatching等。, 以实例说明异常处理带给C++类和函数的冲击。, ...

    C++中的虚函数(virtual function).doc

    C++中的虚函数(virtual function).doc virtual function

    Effective+C+++3rd+chm+中文版(代码加亮)

    对于 C++ ——一种以拥有非同寻常的能力范围和表现力而自豪的语言——更是尤其如此。如果能正确使用,与 C++ 共事是一件令人快乐的事情。极多样的设计样式被直接表达并有效实现。对于 classes(类),functions...

    More Effective C++中文版(封面绝对是最新版)(带目录)

    继Effective C++之后,Scott Meyers于1996推出这本“续集”。条款变得比较少,页数倒是多了一些,原因是这次选材比“第一集”更高阶,尤其是第5章。Meyers将此章命名为技术(techniques),并明白告诉你,其中都是...

    More Effective C++(中文版)

    某些小范围主题诸如「在base classes 中使用virtual destructor」、「令operator= 传回*this 的reference」,可能在百科型C++ 语言书籍中亦曾概略提过,但此类书籍以深度探索的方式,让我们了解问题背后的成因、最佳...

    C++中的虚函数(virtual function).rar_C++虚函数_虚函数

    C++中的虚函数(virtual function)

    C++中的虚函数(virtual function)

    C++中的虚函数(virtual function) 1.简介 虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。假设我们有下面的类层次: class A { public: virtual void foo() { cout ...

    Effective C++(第三版)

    条款35:考虑virtual函数以外的其他选择 consider alternatives to virtual functions. 条款36:绝不重新定义继承而来的non-virtual函数 never redefine an inherited non-virtual function. 条款37:绝不重新定义...

    C++中基类的析构函数为什么要用virtual虚析构函数.pdf

    C++中基类的析构函数为什么要用virtual虚析构函数.pdf

    c#学习笔记——学习心得

    可以被这个类或者结构的所有成员函数(方法、构造函数)使用,可以是值类型或引用类型,主要有实例字段和静态字段。区别于局部变量在于局部变量只能被给定的函数或代码块使用 属性:一种用于访问对象或类的特性的成员...

Global site tag (gtag.js) - Google Analytics