模版与多态

模版与多态

估计标题和摘要都说不清楚,先直接用以前的一个demo说明一下多态吧。
demo中有一个terrain类,代表地形,地形要做的工作就是调整player和enemy的高度,以便让它们看起来是正确的站在地面上。
负责这个工作的函数是CTerrain::Support(param),现在的问题是param的类型。在设定上,无论是terrain->support(player),或者terrain->support(enemy),Support函数内所做的调用是完全相似的。
因此,第一直觉是,抽象出player和enemy的基类cast,并将被CTerrain::Support调用的函数写成(纯)虚函数。
代码大概是这样子:

class   CCast
{
public :
  
virtual    void   DoSomething1()  =   0 ;
  
virtual    void   DoSomething2()  =   0 ;
}
;
class   CPlayer :  public  CCast  {} ;
class   CEnemy :  public  CCast  {} ;

class   CTerrain
{
public :
  
void   Support(CCast  * cast)
  
{
    cast
-> DoSomething1();
    cast
-> DoSomething2();
  }

}
;

接下来聊聊模板的表现。基于上面的代码,把CCast类去掉,同时CPlayer和CEnemy类仍旧实现成员函数DoSomething1()和DoSomething2()。CTerrain类修改一下:
class   CTerrain
{
public:
  template
<typename CAST>
  
void  Support(CAST  *cast)
  
{
    cast
->DoSomething1();
    cast
->DoSomething2();
  }

}
;

情况大概就是这样子了,需要思考的是:
1,模板是编译时刻决定选择,多态是runtime时刻决定选择。那么,如果事务的环境允许编译时刻决定选择,采用模板方案是否更有意义?CEGUI在msg->handler的映射上采用了模板机制。
2,多态有虚拟函数表的开销,模板的实例化,同样有类似于函数重载的开销。不过,多态的开销包括时间和空间上的,而模板仅仅是空间开销。
3,如果坚持用模板构建整个project,那么设计上就要抹去runtime时刻决定选择的行为,这是否会增加程序复杂度,降低可扩展性?

你可能感兴趣的:(模版与多态)