首页
外语
计算机
考研
公务员
职业资格
财经
工程
司法
医学
专升本
自考
实用职业技能
登录
计算机
阅读下列说明和C++代码,填写程序中的空,将解答写入答题纸的对应栏内。 【说明】 以下C++代码实现一个简单乐器系统,音乐类(Music)可以使用各类乐器(Instrument)进行演奏和调音等操作。对部分乐器进行建模,其类图如图6-1所示,包括:乐器(I
阅读下列说明和C++代码,填写程序中的空,将解答写入答题纸的对应栏内。 【说明】 以下C++代码实现一个简单乐器系统,音乐类(Music)可以使用各类乐器(Instrument)进行演奏和调音等操作。对部分乐器进行建模,其类图如图6-1所示,包括:乐器(I
admin
2020-05-13
50
问题
阅读下列说明和C++代码,填写程序中的空,将解答写入答题纸的对应栏内。
【说明】
以下C++代码实现一个简单乐器系统,音乐类(Music)可以使用各类乐器(Instrument)进行演奏和调音等操作。对部分乐器进行建模,其类图如图6-1所示,包括:乐器(Instrument)、打击乐器(Percussion)、弦乐器(Stringed)、管乐器(Wind)、木管乐器(Woodwind)、铜管乐器(Brass)。
【C++代码】
#include<iostream>
#include<vector>
using namespace std;
enum Note{/*枚举各种音调*/
MIDDLE_C,C_SHARP,B_FLAT //其他略
};
class Instrument{/*抽象基类,乐器*/
public:
________________; //纯虚函数play
virtual void adjust() = 0; //adjust函数接口
};
class Wind:________________{
public:
void play(Note n) { cout<<“Wind.play() ”<<n<<endl; }
void adjust(){cout<<“Wind.adjust()”<<endl; }
};
/*类Percussion和Stringed实现代码略*/
class Brass:________________{
public:
void play(Note n) {cout<<“Brass.play() ”<<n<<endl;}
void adjust(){ cout<<“Brass.adjust()”<<endl;}
};
class Woodwind:public Wind{
public:
void play(Note n){cout<<“Woodwind.play()”<<n<<endl; }
};
class Music {
public:
void tune(Instrument* i){i->play(MIDDLE_C); }
void adjust(Instrument* i){ i->adjust(); }
void tuneAll(________________v){ /*为每个乐器定调*/
vector<Instrument*>::iterator it ;
for(it=v.begin();it !=v.end(); it++) {
this->adjust(*it);
this->tune(*it);
}
}
};
int main(){
________________ music=new Music();
Vector<Instrurment*>orchestra;
orchestra.push back(new Wind());
orehestra.push_back(new Woodwind());
musiC->tuneAll(orchestre);
}
选项
答案
virtual void play(Note n)=0 public Instrument public Wind vector<Instrument*>或vector<Instrument*>& Music*
解析
本题考查C++语言程序设计能力,涉及类、对象、函数的定义和相关操作。要求考生根据给出的案例和代码说明,阅读并完成程序填空。
本题目中涉及的部分乐器,音乐类利用各类乐器进行演奏和调音等操作。根据说明进行设计,题目给出了类图(图6-1类图所示)。
图中父接口 Instrument代表乐器,C++中设计为抽象基类,包含表示进行演奏的纯虚函数play()和表示调音的纯虚函数adjust()。其中函数play()的参数Note实现为枚举类型(enum),以枚举各种音调。这两个函数由具体子类型完成实现,所以Instrument的play()和adjust()为纯虚函数,原型中=0表示纯虚函数,实现由子类完成:
virtual void play(Note n)=0;
virtual void adjUSt()=0;
Wind、Percussion和Stringed都继承自Instrument的三个子类型,Woodwind和Brass都继承自Wind的两个子类,继承用“:关键字”,所以他们都继承了Instrument的play()和adjust()函数,各自演奏和调音方式有所不同,所以都覆盖了Instrument的play()函数和adjust()函数,并加以实现:
void play(Note n){/*代码略*/}
void adjust(){/*代码略*/}
图6-1中Woodwind类对应的Woodwind的实现中只有play(),覆盖(Override)了父类中的play(),没有adjust(),因此其父类Wind的adjust()会自动复制并被调用,而Brass中play()和 adjust()均有实现,即都覆盖了父类中的方法。
Music类对各类乐器进行演奏和调音操作。函数tune()为一个乐器的定调,其参数为乐器对象指针Intrument*;函数adjust()为一个乐器进行调音,其参数也为Intrument*;函数tuneAll()为所有乐器定调,其参数是所有乐器容器。tuneAll()函数的调用来自main()函数,其中参数为所构造的对象指针向量容器vector<Instrument*>类型,容器中元素类型用Instrument*表示,在源代码开头#include<vector>,所以tuneAll的参数类型为vector<Intrument*>。并采用for循环获取容器中每一个乐器并进行adjust()和tune()调用,即:
void tuneAll(vector<Intrument*>v) { /*为每个乐器定调*/
vector<Instrument*>::iterator it;
for(it=v.begin();it!=V.end(),it++) {
this->adjust(*it);
this一>tune(*it);
}
}
Music中的tune()和adjust()的参数均为Instrument*类型的对象指针i,再通过i一>play()和i->adjust()的函数调用,其真正执行的函数根据所传实际对象指针所指对象而定,即动态绑定。
主控逻辑代码在main()函数中实现。在main()函数中,先初始化Music类的对象指针music,即:
Music*music = new Music();
并初始化各类乐器对象指针容器orchestra,各类乐器用抽象父类指针Instrument*类型,因为向上转型是安全的,可以自动向上转型成为Instrument*类型,用父类表示其各个子类型,即:
vector<Instrument*>orchestra;
然后使用vector中push_back()方法向容器中加入具体乐器对象,此处以Wind及其子类Woodwind为例:
Orchestra.push_back(new Wind());
Orchestra.push_back(new Woodwind());
然后调用music的tuneAll()函数music一>tuneAll(orchestra);,实现为orchestra中的每个乐器定调,其参数为orchestra向量。orchestra中的元素的类型为Instrument*,所以tuneAll()的参数也应该为Instrument*相应的向量,而非其子类型。在tuneAll()函数体内部,为每个数组调用当前对象的tune()和adjust()。
综上所述,空(1)需要定义纯虚方法play(Note n),题目代码中已经给出用分号结尾,所以空(1)为virtual void play(Note n)=0:空(2)需要继承抽象类Instrument,程序中已经给出“:”号,即只需public Instrument;空(3)需要继承Wind,程序中也已经给出“:”号,即public Wind:空(4)需要定调的乐器容器,即vector<Instrument*>或vector<Instrument*>&;空(5)处为创建Music类的对象指针,即Music*。
转载请注明原文地址:https://kaotiyun.com/show/W2jZ777K
本试题收录于:
程序员下午应用技术考试题库软考初级分类
0
程序员下午应用技术考试
软考初级
相关试题推荐
下列关于系统软件的叙述中,正确的是(7)。
在Excel2010中,设单元格A1、A2、A3、A4中的值分别为20、3、16、20,若在单元格B1中输入函数“=PR0DUCT(ApA2)/MAX(A3,A4)”,按回车键后,则B1单元格中的值为(
Windows XP的许多应用程序的“文件”菜单中,都有“保存”和“另存为”两个命令。以下对这两个命令的叙述,正确的是(36)。
在Access2007中,若要想查询所有姓名为2个汉字的学生记录,应在准则中输入______。
张、王、李三个平等的评委独立对三部电影甲、乙、丙进行了评分(三人的满分标准不同),结果如下表:按合理的平均得分计算,第一、二、三名电影应分别授予(69)。
在Access中,查询“学生”数据表的所有记录及字段的SQL语句是______。
2008年9月27日,地面指挥中心通过“天地语音系统”和航天员进行了通话。“天地语音系统”的地面设备包括通信设备、数据传输设备、分组交换设备和地面卫星通信站等,飞船上则配备了无线通信、视频传输与数据记录等设备,使得航天员与地面指挥中心随时可以进行信息交流。
阅读以下说明,回答问题1至问题6,将解答填入答题纸对应的解答栏内。【说明】在Linux下安装配置DHCP服务,DHCP服务程序/usr/sbin/dhcpd需要读取配置文件/etc/d/hcpd.conf,以下是一个DHCP配置文件的主要内容:
从以下备选答案中为程序中(1)~(5)处空缺内容选择正确答案,填入答题纸对应的解答栏内。(1)A.CreatObject()B.connect0C.go()D.open()(2)A."select*fromdata"B."select
阅读以下说明,回答问题1至问题5,将解答填入对应栏内。[说明]某大学要拟建一个小型局域网,如图10-5所示,PCI、PC3、PC5的IP地址分别为10.244.80.2,10.244.80.3,10.244.80.4子网掩码是255.255
随机试题
《万壑松风图》的作者是()。
(2005年第50题)狼疮性肾炎的特征性病变是
免疫应答的过程应不包括
萨尔斯大学的所有女生都爱吃奶油蛋糕。所有爱吃奶油蛋糕的人都嫌自己长得胖。只有萨尔斯大学的女生才会在意别人的评论。 假设上述论断都是真的,则以下哪个选项也一定为真?()所有嫌自己长得胖的人都在意别人的评论。所有在意别人评论的人都爱吃
请认真阅读下列材料,并按要求作答。
1-3339()
Ifsoldieringwasforthemoney,theSpecialAirService(SAS)andtheSpecialBoatService(SBS)wouldhavedisintegratedinre
Bearsvaryasmuchincharacterandhabitsasthey【C1】______insize.Althoughafewkinds,suchasgrizzliesandpolarbears,a
HowlonghadMs.Hui-wenZhangworkedinZhidaCo.,Ltd.?Shehadworkedtherefor______years.WhendidsheleaveZhida.Co.
RecentlytheonlineencyclopediaWikipediacelebratedits10thbirthday.Manymediaoutlets【B1】______itsgrowth,numberofartic
最新回复
(
0
)