这篇文章围绕这个一个简单的问题:
为游戏的人物设定一个继承体系,人物的健康状态可能会发生变化,则需要为人物计算他们的健康指数:
最明白的一个方案是将创建一个virtual
函数int
healthValue(),用来计算健康指数。
下面的其他的替代方案:
<!--[if !supportLists]-->1、
<!--[endif]-->由no-virtual interface 手法实现的template method模式
healthValue仍然为public接口。当却不再是virtual。然后它调用private(protected) virtual函数dohealthValue()。derived classes继承并实现这个函数。
也就是:以public no-virtual函数包裹较低访问性(private或protected)的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,这个体系和人物体系存在对于关系。
优点是熟悉设计模式的人都比较容易识别,而且很容易添加健康算法。
分享到:
相关推荐
条款35:考虚virtual函数以外的其他选择 条款36:绝不重新定义继承而来的non-virtual函数 条款37:绝不重新定义继承而来的缺省参数值 条款38:通过复合塑模出has-a或“根据某物实现出” 条款39:明智而审慎地...
某些小范围主题诸如「在base classes 中使用virtual destructor」、「令operator= 传回*this 的reference」,可能在百科型C++ 语言书籍中亦曾概略提过,但此类书籍以深度探索的方式,让我们了解问题背後的成因、最佳...
和其前一本兄弟书籍 Effective C++一样,More Effective C++对每一位以C++为开发工具的程序员而言,都必备读物。 继 Effective C++ 之後,Scott Meyers 於 1996 推出这本「续集」。条款变得比较少,页数倒是多了...
全面地描述了C++专家所使用的高级技术,包括placement new、virtual constructors、smart pointers、reference counting、proxy classes和double-dispatching等。 以实例说明异常处理带给C++类和函数的冲击。 ...
继 Effective C++ 之後,Scott Meyers 於 1996 推出这本「续集」。条款变得比较少,页数倒是多了一些,原因是这次选材比「第一集」更高阶,尤其是第五章。Meyers 将此章命名为技术(Techniques),并明白告诉你,...
(譯註:為了協助讀者更容易掌握 Effective C++ 和More Effective C++ 二書,我以Effective C++ CD 為本,為兩書的中文版額外加上兩書之間的交叉索引。此乃原書所無。如果文中出現像條款 M5 這樣的參考指示,M 便是...
C++析构函数使用virtual的原因
, 全面地描述了C++专家所使用的高级技术,包括placement new、virtual constructors、smart pointers、reference counting、proxy classes和double-dispatching等。, 以实例说明异常处理带给C++类和函数的冲击。, ...
C++中的虚函数(virtual function).doc virtual function
对于 C++ ——一种以拥有非同寻常的能力范围和表现力而自豪的语言——更是尤其如此。如果能正确使用,与 C++ 共事是一件令人快乐的事情。极多样的设计样式被直接表达并有效实现。对于 classes(类),functions...
继Effective C++之后,Scott Meyers于1996推出这本“续集”。条款变得比较少,页数倒是多了一些,原因是这次选材比“第一集”更高阶,尤其是第5章。Meyers将此章命名为技术(techniques),并明白告诉你,其中都是...
某些小范围主题诸如「在base classes 中使用virtual destructor」、「令operator= 传回*this 的reference」,可能在百科型C++ 语言书籍中亦曾概略提过,但此类书籍以深度探索的方式,让我们了解问题背后的成因、最佳...
C++中的虚函数(virtual function)
C++中的虚函数(virtual function) 1.简介 虚函数是C++中用于实现多态(polymorphism)的机制。核心理念就是通过基类访问派生类定义的函数。假设我们有下面的类层次: class A { public: virtual void foo() { cout ...
条款35:考虑virtual函数以外的其他选择 consider alternatives to virtual functions. 条款36:绝不重新定义继承而来的non-virtual函数 never redefine an inherited non-virtual function. 条款37:绝不重新定义...
C++中基类的析构函数为什么要用virtual虚析构函数.pdf
可以被这个类或者结构的所有成员函数(方法、构造函数)使用,可以是值类型或引用类型,主要有实例字段和静态字段。区别于局部变量在于局部变量只能被给定的函数或代码块使用 属性:一种用于访问对象或类的特性的成员...