[说明]
某游戏公司现欲开发一款面向儿童的模拟游戏,该游戏主要模拟现实世界中各种鸭子的发声特征、飞行特征和外观特征。游戏需要模拟的鸭子种类及其特征如表下表所示。
为支持将来能够模拟更多种类鸭子的特征,采用策略设计模式(strategy)设计的类图如图5-1所示。
其中,Duck为抽象类,描述了抽象的鸭子,而类RubberDuck、MallardDuck、CottonDuck和RedHeadDuck分别描述具体的鸭子种类,方法fly()、quack()和display()分别表示不同种类的鸭子都具有飞行特征、发声特征和外观特征;类FlyBehavior与QuackBehavior为抽象类,分别用于表示抽象的飞行行为与发声行为;类FlyNoWay与FlyWithWings分别描述不能飞行的行为和用翅膀飞行的行为;类Quack、Squeak与QuackNoWay分别描述发出“嘎嘎”声的行为、发出橡皮与空气摩擦声的行为与不发声的行为。请填补以下代码中的空缺。
[C++代码]
# include<iostream>
using namespace (1) ;
class FlyBehavior
public : (2) fly()=0;
;
class QuackBehavior
public: (3) quack()=0;
Class FlyWithWings :public F1yBehavior
public: void fly()cout<<"使用翅膀飞行!"<<endl;
;
class FlyNoWay :public FlyBehavior
public: void fly()cout<<"不能飞行!">>endl;
;
class Quack :public QuackBehavior
public: void quack()cout<<"发出\’嘎嘎’\声!"<<endl;
;
class Squeak :public QuackBehavior
public: void quack()cout<<"发出空气与橡皮摩擦声!"<<endl;
;
class QuackNOWay :public QuackBehaVior
public: void quack()cout<<"不能发声!"<<endl;
;
C1ass Duck
protected:
FlyBehavior * (4) ;
QuackBehaVior * (5) ;
public:
VOid fly() (6) ;
VOid quack() (7) ; ;
virtual void display()=0;
;
class RubberDuck: public Duck
public:
RubberDuck()
flyBehavior=new (8) ;
quackBehavior=new (9) ;
~RubberDuck()
if (!flyBehavior) delete flyBehaVior;
i f(!quackBehavior)delete quackBehavior;
Void display() /*此处省略显示橡皮鸭的代码*/
//其他代码省略
(9)处填()。
参考答案:Squeak()
解析:
本题考查面向对象的程序设计的抽象类和多态。程序解释如下:
(1)using namespace (1)std ; /*所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。*/
(2)由题中信息:类FlyBehavior与QuackBehavior为抽象类,分别用于表示抽象的飞行行为与发声行为,而这两种行为对应的不止是一种方式,为了表示多种行为方式(即多态),需要定义虚函数,用以给子类进行重载。再由予类中的函数voidfly()及void quack()可知,父类中的对应函数返回值也应为void。所以(2)和(3)的填空如下:
class FlyBehavior{
public: (2) virtual void fly( )=O;
};
class Qutack: Behavior{
public: (3) virtual void quack( )=0;
}
(3)Duck类的定义, 由子类RubberDuck类中出现的“flvBehavior=newlyNoWay();quackBehavior=new Squeak();”可知这两个指针类型对象为nyBehavior。和quackBehavior。所以(4)和(5)填空如下:
Class Duck{
protected:
FlyBehavior * (4) fiybehavior;
QuackBehavior * (5) quackBehavior;
由“FlyBehavior * flyBehavior;QuackBehavior * quackBehavior;”及函数名可知,该函数体应调用FlyBehavior类中的ny函数和QuackBehavior类中的quack函数。所以(6)和(7)填空如下:
public:
void fly(){ (6) fiybehavior->fiy(); }
void quack(){ (7) quackBehavior->quack(); };
virtual void display()=0;
};
(4)由题中所给信息可知RubberDuck是“发出空气与橡皮摩擦声”并且“不能飞行”的鸭子种类,因此构造函数中创建的对象flyBehavior和quackBehavior对应的类型分别为FlyNoWay,Squeak,所以第(8)和(9)空的填空如下:
Class RubberDuck: public Duck {
public:
RubberDuck(){
flyBehavior=new (8) FiyNoWay();
quackBehaVior=new (9) Squeak();