一个游戏中有多种怪物(Monster),怪物之间可能要发生战斗(fight),每场战斗都是一个怪物与另一怪物之间的一对一战斗。每个怪物都有自己的生命值(hitpoint)、攻击力值(damage)和防御力值(defense),每种怪物都有各自特有的攻击(attack)方式,产生相应的攻击效果;战斗时,两个怪物依次攻击对方,即怪物a首先攻击怪物b, 然后轮到怪物b攻击怪物a, 之后,怪物a再次攻击怪物b,…, 直到一方生命值为0。作为怪物的特例,猫和狗的攻击效果如下表所示。猫进攻导致对方的生命值减少量:(猫的攻击力值 * 2 — 对方的防御力值) 若上式小于1,则取1狗进攻导致对方的生命值减少量:(狗的攻击力值 — 对方的防御力值 +5 )*2 若上式小于2,则取2根据给出的描述,最适当的Monster类定义是:
A. class Monster {public:virtual ~Monster( );virtual bool fight (Monster & other) = 0;private:virtual bool attack(Monster & other) = 0;};
B. class Monster {public:virtual ~Monster( );bool fight (Monster & other) ;private:virtual bool attack(Monster & other) = 0;};
C. class Monster {public:virtual ~Monster( );virtual bool fight (Monster & other) = 0;private:bool attack(Monster & other) ;};
D. class Monster {public:bool fight (Monster & other);private:bool attack(Monster & other);};
查看答案
模拟销售员销售产品,需定义Saler类。其中在销售过程中,销售员有一定几率人品爆发,会以2倍原价的价格销售产品。那么下面定义,哪种最合适?
A. class Saler {public:int sale( const Product & product);};class Product {public:bool isLucky( ) const;};
B. class Saler {public:virtual ~Saler( );virtual int sale( const Product & product);};class LuckySaler:public Saler {public:virtual ~LuckySaler( );virtual int sale( const Product & product);};
C. class Saler {public:int sale( const Product & product);};class LuckySaler {public:int sale( const Product & product);};
D. class Saler {public:int sale( const Product & product);private:bool isLucky( ) const;};
现有货币类、电子支付类,如下:class Currency { //货币public:virtual ~Currency( );voidexchange( );/* 其它略 */private:Country * mpCountry;};class EPay { //电子支付public:void pay( );/* 其它略 */private:Bank * mpBank;};小王定义数字货币类(Decp)时,考虑到Decp必须具备货币的全部功能,又有电子支付的全部功能,即Decp既可以当做货币用,也可以当做一种电子支付使用。现采用了多重继承的方式复用已定义的类,如下:class Decp:public Currency, public EPay { /* 略 */};但是,小王希望Decp类有更好的适应性,特别是对于EPay类,虽然现在没有子类,但未来一定会派生其它子类。那么最合理的定义方式是哪种?
A. class Decp:public Currency {public:voidexchange( );voidpay( ) { mpEPay->pay( ); }/* 构造、析构、拷贝、赋值等略*/private:EPay * mpEpay;};
B. class Decp:public EPay {public:voidexchange( ){ mpCurency->exchange( ); }voidpay( );/* 构造、析构、拷贝、赋值等略*/private:Currency * mpCurency;};
C. class IEPay {pubic:virtual ~IEPay( ) { }virtual void pay( ) = 0;};class EPay:public IEPay {/*略*/};class Decp:public Currency , public IEPay {public:voidexchange( );voidpay( ) { mpEPay->pay( ); }/* 构造、析构、拷贝、赋值等略*/private:IEPay * mpEpay;};
D. class IEPay {pubic:virtual ~IEPay( ) { }virtual void pay( ) = 0;};class EPay:public IEPay {/*略*/};class Decp:public Currency , public IEPay {public:voidexchange( );voidpay( );};
当类A的成员函数需要传递T类型的参数时,常采用传引用的形式,如 void A::f( T& t);而不是传值对象形式,如 void A::f( T t );那么,下面给出的说明此问题的理由,错误的是:
A. 传值对象需要类T必须有拷贝构造函数
B. 传引用可以利用类T的动态多态性,增加类A的可复用性
C. 传值对象程序效率低,传引用程序效率高
D. 传值对象不要求类T有虚函数,但类T在大多数情况下是有虚函数的,因此常见传引用
已有Parent类,那么定义Parent类的子类Child时,错误的说法是:
A. Child类可以组合Parent类,同时又依赖Parent类
B. Child类可以依赖Parent类,同时又普通关联Parent类
Child类可以组合Parent类,同时又普通关联Parent类
D. Child类可以组合或依赖或普通关联Parent类,但不能同时存在两种或两种以上的关系