第8章虚函数与多态性8.1选择题1.在C++中,要实现动态联编,必须使用(d)调用虚函数。(a)类名(b)派生类指针(c)对象名(d)基类指针2.下列函数中,可以作为虚函数的是(c,d)。(a)普通函数(b)构造函数(c)成员函数(d)析构函数3.在派生类中,重载一个虚函数时,要求函数名、参数的个数、参数的类型、参数的顺序和函数的返回值(b)。(a)不同(b)相同(c)相容(d)部分相同4.下面函数原型声明中,(b)声明了fun为纯虚函数。(a)voidfun()=0;(b)virtualvoidfun()=0;(c)virtualvoidfun();(d)virtualvoidfun(){};5.若一个类中含有纯虚函数,则该类称为(d)。(a)基类(b)纯基类(c)派生类(d)抽象类6.假设Aclass为抽象类,下列声明(a,c,d)是错误的。(a)Aclassfun(int);(b)Aclass*p;(c)intfun(Aclass);(d)AclassObj;7.下面描述中,正确的是(b,d)。(a)虚函数是没有实现的函数(b)纯虚函数的实现在派生类定义(c)抽象类是只有纯虚函数的类(d)抽象类指针可以指向不同的派生类8.2阅读下列程序,写出执行结果1.#includeiostream.hclassBclass{public:Bclass(inti,intj){x=i;y=j;}virtualintfun(){return0;}protected:intx,y;};classIclass:publicBclass{public:Iclass(inti,intj,intk):Bclass(i,j){z=k;}intfun(){return(x+y+z)/3;}private:intz;};voidmain(){Iclassobj(2,4,10);Bclassp1=obj;coutp1.fun()endl;Bclass&p2=obj;coutp2.fun()endl;coutp2.Bclass::fun()endl;Bclass*p3=&obj;coutp3-fun()endl;}答案:05052.#includeiostream.hclassBASE{public:virtualvoidgetxy(inti,intj=0){x=i;y=j;}virtualvoidfun()=0;protected:intx,y;};classA:publicBASE{public:voidfun(){coutx=x'\t'y=x*x=x*xendl;}};classB:publicBASE{public:voidfun(){coutx=x'\t'y=yendl;couty=x/y=x/yendl;}};voidmain(){BASE*pb;Aobj1;Bobj2;pb=&obj1;pb-getxy(10);pb-fun();pb=&obj2;pb-getxy(100,20);pb-fun();}答案:x=10y=x*x=100x=100y=20y=x/y=58.3编程题1.使用虚函数编写程序求球体和圆柱体的体积及表面积。由于球体和圆柱体都可以看作由圆继承而来,所以可以定义圆类circle作为基类。在circle类中定义一个数据成员radius和两个虚函数area()和volume()。由circle类派生sphere类和column类。在派生类中对虚函数area()和volume()重新定义,分别求球体和圆柱体的体积及表面积。解答:#includeiostream.hconstdoublePI=3.14159265;classcircle{public:circle(doubler){radius=r;}virtualdoublearea(){return0.0;}virtualdoublevolume(){return0.0;}protected:doubleradius;};classsphere:publiccircle{public:sphere(doubler):circle(r){}doublearea(){return4.0*PI*radius*radius;}doublevolume(){return4.0*PI*radius*radius*radius/3.0;}};classcolumn:publiccircle{public:column(doubler,doubleh):circle(r){height=h;}doublearea(){return2.0*PI*radius*(height+radius);}doublevolume(){returnPI*radius*radius*height;}private:doubleheight;};voidmain(){circle*p;spheresobj(2);p=&sobj;cout球体:endl;cout体积=p-volume()endl;cout表面积=p-area()endl;columncobj(3,5);p=&cobj;cout圆柱体:endl;cout体积=p-volume()endl;cout表面积=p-area()endl;}2.某学校对教师每月工资的计算规定如下:固定工资+课时补贴。教授的固定工资为5000元,每个课时补贴50元。副教授的固定工资为3000元,每个课时补贴30元。讲师的固定工资为2000元,每个课时补贴20元。定义教师抽象类,派生不同职称的教师类,编写程序求若干个教师的月工资。解答:略。3.改写第7章习题7.3第3题,把Shape类定义为抽象类,提供共同操作界面的纯虚函数。TwoDimShape类和ThreeDimShape类仍然抽象类,第3层具体类才能提供全部函数的实现。在测试函数中,使用基类指针实现不同派生类对象的操作。解答:略