注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

刘邓

每天收获一点点-目标:富足

 
 
 

日志

 
 

C++高级细节(1)  

2012-05-10 17:30:58|  分类: C++编程思想(卷 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
1.虚函数和多态
加入在一个大型的游戏中,有个NPC基类和诸多从NPC基类继承下来的NPCSON类,每个NPC都有自己的行为:一切正常的时候walk()
如果出现情况则调用fight() 

class CNPC
{
int m_hp;
int m_mp
public:
CNPC(int,int);
~CNPC();
virtual void walk();
virtual void fight();
};

class CNPCSON1:public class CNPC
{
public:
CNPCSON1(int hp,int mp):CNPC(hp,mp){}
void walk(){......}
void fight(){.....}
};

class CNPCSON2:public class CNPC
{
public:
CNPCSON2(int hp,int mp):CNPC(hp,mp){}
void walk(){......}
void fight(){.....}
}

....
....
class CNPCSONn :public class CNPC
{
...
...
}

void do(CNPC &npc)//每个子类对象都只要调用一次这个函数即可以实现AI行为,不许要为每个子类都写不同的行为组合函数
{
if(everything is ok) npc.walk;
else npc.fight
}


2.虚函数实现
虚函数的实现是通过虚函数指针VPTR和虚函数表VTABLE实现的(当然是由编译器自动完成的),编译器发现virtual关键字时就为该类创建一个VTABLE存放虚函数地址,同时插入一个VPTR指针指向VTABLE(具体找到每个函数是通过偏移量实现的)。在程序运行时,系统通过判断调用接口函数对象的具体类型来判断是调用哪个类VTABLE中的哪个虚函数
虚函数在C++中是可选的是因为C++是为了提供更高的效率选择,既然这么说用虚函数肯定是涉及到性能的损失:正如上面虚函数实现所描述饿那样,为了实现虚函数系统要多建立一个VTABLE和一个VPTR这浪费了空间效率,另外由于调用虚函数传递的不是绝对的函数地而是先将对象地址压栈,然后通过对象地址间接寻址到VTABLLE中的函数地址,这同样需要时间。
不过相比较虚函数带来的生产效率上的提升,这10%不到的性能损失在现代是可以接受的

3.晚捆绑的实现
虚函数的晚捆绑实现一定是基于指针的行为!
BASE base;//此时建立了base类的对象,不存在晚捆绑的问题了,(C++编译器这么做同样出于效率的考虑)
BASE *base;//此时base是可变的,可以将子类对象的地址传递给base实现向上类型转换,这就可以实现晚捆绑
  评论这张
 
阅读(81)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017