C++编程杂谈之三:面向对象(续)

2016-01-29 12:19 5 1 收藏

C++编程杂谈之三:面向对象(续),C++编程杂谈之三:面向对象(续)

【 tulaoshi.com - C语言心得技巧 】


C++编程杂谈之三:面向对象(续)

作者:xulion

下载例子源代码

 

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)     上一篇我们涉及了面向对象的一个基本概念--封装,封装是一个相对比较简单的概念,也很容易接受,但是很多的场合下面,仅仅是封装并不能很好的解决很多问题,考虑下面的例子:
假设我们需要设计一个对战游戏的战斗细节,在最初的版本中我们将支持一种动作--fight。假设我们有三种角色:fighter、knight和warrior,每种角色的health、hit point不同,基于封装的基本想法,我们很自然的想到对每个对象使用类的封装,首先明显的元素有2个:health、hit point,另外还有name(我们不能只有三个角色)和战斗的速度speed,方法有:hit、isalive。基于这样的想法,我们给出下面的类:
 
 class fighter{private:int               m_iHealth;int              m_iSpeed;//为了方便,这个值使用延时值,越大表示速度越慢const int          m_iHitPoint;char             m_strName[260];public:fighter(const char* strName);void hit(fighter* pfighter);bool isAlive(); };    
    上面的类可以清楚的抽象出我们所需要表达的数据类型之一,这里也许你已经发现了一些问题:
成员函数hit用来处理战斗事件,但是我们有不同的角色,fighter不可能只跟自己同样的对手作战,我们希望它能和任何角色战斗,当然,使用模板函数可以简单的解决这个问题。另外,我们必须去实现三个不同的类,并且这些类必须都实现这些属性和方法。即使这些问题我们都解决了,现在我们要组织两个队伍作战,我们希望使用一种群体类型来描述它们,问题是我们必须针对每一种类建立相应的群体结构,当然你可以认为3个不同的类型不是很多,完全可以应付,那么如果有一天系统升级,你需要管理上百种类型的时候,会不会头大呢?
    在C++中,继承就可以很好的解决这个问题,在C++中,继承表示的是一种IS-A关系,即派生类IS-A基类,很多现实世界中的关系可以这样来描述,如:dog is-a animal,dog是animal的派生(继承),继承产生的对象拥有父(基)对象的所有属性和行为,如animal的所有属性和行为在dog身上都会有相应的表现。在UML的描述中,这种关系被称为泛化(generalization)。一般情况下,当我们需要实现一系列相似(具有一定的共性)然而有彼此不同的类别的时候,使用继承都是很好的解决办法,例如前面的代码虽然也能够实现我们的目标,但是显然很难管理,下面给出使用继承后的实现:
 class actor//基类{protected:int               m_iHealth;const int         m_iSpeed;//为了方便,这个值使用延时值,越大表示速度越慢const int         m_iHitPoint;char              m_strName[260];public:actor(const char* strName,const int iHealth,const int iSpeed,const int iHitpoint);int& Health(){ return m_iHealth; };const char* getName(){ return m_strName; };virtual void hit(actor *Actor) = 0;bool isAlive(); };  actor::actor(const char* strName,const int iHealth,const int iSpeed,const int iHitpoint):m_iHealth(iHealth),m_iSpeed(iSpeed),m_iHitPoint(iHitpoint){strcpy(m_strName,strName);}bool actor::isAlive(){return (m_iHealth>0);}///////////////////////////////////////////////////////////类fighterclass fighter :public actor{public:fighter(const char* strName);virtual void hit(actor *Actor);private:};fighter::fighter(const char* strName):actor(strName,100,20,20){}void fighter::hit(actor *Actor){Sleep(m_iSpeed);if(!isAlive()){return ;}if(Actor&&Actor->isAlive()){ //这里我们用一个函数做了左值,因为函数返回的是引用if(isAlive())Actor->Health() = Actor->Health() - m_iHitPoint;}}///////////////////////////////////////////////////////////类knightclass knight :public actor{public:knight(const char* strName);virtual void hit(actor *Actor);private:};knight::knight(const char* strName):actor(strName,150,20,25){}void knight::hit(actor *Actor){Sleep(m_iSpeed);if(!isAlive()){return ;}if(Actor&&Actor->isAlive()){if(isAlive())Actor->Health() = Actor->Health() - m_iHitPoint;}}///////////////////////////////////////////////////////////类warriorclass warrio
                        

来源:https://www.tulaoshi.com/n/20160129/1485572.html

延伸阅读
废话不说,直接进入正题,本文承接先前发布的《C/C++编程新手错误语录》(http://www.pconline.com.cn/pcedu/empolder/gj/c/0508/691597.Html),继续归纳错误语录。 !-- frame contents -- !-- /frame contents -- (8)“我想用malloc”、“我用不好malloc” 来看看一个变态程序: /* xx.c:xx模块实现文件 */ int...
标签: Delphi
  2.1.8.4 过程和函数的语句部分         过程或函数的语句部分由 begin 开始, end结束。函数需要一个返回值。可以将返回值赋给函数名称,也可以将返回值赋给 Result 变量。下面的例程将返回值赋给函数名称: function CalculateInterest(Principal,InterestRate: Double):Double; begi...
标签: Web开发
----什么是类和对象     这是所有面向对象编程之前必须弄明白的.     所谓类:简单地说就是模板,说的专业一些,是一类具有某种性质的物的集合.比如:人就是一个类,车也是一个类,等等.     所谓对象:就是类的具体实现.如上面所说,人是一个类,一个具体的人就是一个对象,比如张三.   &nb...
    在写面向对象的WEB应用程序方面JavaSciprt是一种很好的选择.它能支持OOP.因为它通过原型支持继承的方式和通过属性和方法的方式一样好.很多开发者试图抛弃JS,试着用C#或JAVA仅是因为JS不是他认为合适的面向对象的语言.许多人还没有认识到javascript支持继承.当你写面向对象的代码时.它能给你很强大的能量.你也可以使用它写出...
请注重,这一节内容是c++的重点,要非凡注重! 我们先说一下什么是构造函数? !-- frame contents -- !-- /frame contents -- 上一个教程我们简单说了关于类的一些基本内容,对于类对象成员的初始化我们始终是建立成员函数然后手工调用该函数对成员进行赋值的,那么在c++中对于类来说有没有更方便的方式能...

经验教程

566

收藏

82
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部