问题 填空题

阅读下列函数说明和C++代码,将应填入 (n) 处的字句写在对应栏内。

[说明]

在销售系统中常常需要打印销售票据,有时需要在一般的票据基础上打印脚注。这样就需要动态地添加一些额外的职责。如下展示了Decorator(修饰)模式。SalesOrder对象使用一个SalesTicket对象打印销售票据,先打印销售票据内容,然后再打印脚注。图5-1显示了各个类间的关系。以下是C++语言实现,能够正确编译通过。

[图5-1]

[C++代码]

class Component{

public:

(1) void prtTicket()=0;

};

class SalesTicket:public Component{

public:

void prtTicket(){

cout<<"Sales Ticket!"<<endl;

}

};

class Decorator:public Component{

public:

virtual void prtTicket();

Decorator(Component *myC);

private:

(2) myComp;

};

Decorator::Decorator(Component *myC)

{

myComp=myC;

}

void Decorator::prtTicket()

{

myComp->prtTicket();

}

class Footer:public Decorator{

public:

Footer(Component *myC);

void prtTicket();

void prtFooter();

};

Footer::Footer(Component *myC): (3) {}

void Footer::prtFooter()

{

cout<<"Footer"<<endl;

}

void Footer::prtTicket()

{

(4)

prtFooter();

}

class SalesOrder{

public:

void prtTicket();

};

void SalesOrder::prtTicket()

{

Component *myST;

myST=new Footer( (5) );

myST->prtTicket();

}

(5)处填()。

答案

参考答案:new SalesTicket()

解析:

由函数prtTicket()结尾的“=0”易知,该函数是纯虚函数,须声明为virtual,故空(1)应填virtual。 由Decorator构造函数以及类图可知,Decorator包含一个Component对象引用,故空(2)应填Component*。注意是指针。 函数Footer(Component *myC)是Footer类的构造函数,故空(3)处是对基类的构造,因此空(3)应填Decorator(myC)。 Footer类的prtTicket()方法是先打印“基本”票据,再打印脚注。因此空(4)是打印“基本”票据,Footer类是Decorator的子类,故应先调用基类的打印方法,在此应填Decorator::prtTicket()。::为域作用符。 参照Footer类的参照函数,空(5)应为一个Component对象指针,这里是要打印带脚注的票据,故此处应填new SalesTicket()。

单项选择题
单项选择题 共用题干题