问答题
使用VC6打开考生文件夹下的源程序文件modi3.cpp,要求编写一个CMyShape类,含有求面积求周长等纯虚函数。然后编写一个CMyRectangle类和CMyCircle类继承CMyShape,并实现求面积、求周长的两个函数。在main()函数中测试得到下面的结果: 在CMyShape类构函数造内 在CMyCircle类构造函数内 在CMyShape类构造函数内 在CMyRectangle类构造函数内 myCircle:Area=314.159 Girth=62.8319 myRectangle:Area=900 Girth=120 具体要求如下: (1)定义求面积纯虚函数,请在注释//********1********之处添加适当的语句。 (2)定义求周长纯虚函数,请在注释//********2********之处添加适当的语句。 (3)请在注释//********3********和//********4********之处添加适当的语句。 注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。#include<iostream.h>#include<math.h>#define PI 3.1415926class CMyPoint{public: int x,y; CMyPoint(int tx,int ty):x(tx),y(ty){));class CMyShape{public: CMyShape(){cout<<"在CMyShape类构造函数内"<<endl;} //********1******** //********2********protected:};class CMyCircle:public CmyShape{public: CMyCircle(CMyPoint i,doublej):CMyShape(),arcCenter(i),radius(j){ cout<<"在CMyCircle类构造函数内"<<endl; } double GetArea() { return PI*radius*radius; } double GetGirth() { return 2*PI*radius; }private: CMyPoint arcCenter; double radius;};class CMyRectangle:publicCmyShape{public: CMyRectangle(CMyPointit,CMyPoint rb):leftTop(1t),rightB0ttom(rb),CMyShape(){ cout<<"在 cMyRectangle类构造函数内"<<endl; } Double GetArea() { Int W1dth=abS(rightBottom.x-leftTop.x); int height:abs(rightBottom.y-leftTop.y); Return width*height; } double GetGirth() { int width=abs(rightBottom.x-leftTop.x); int height=abs(rightBottom.y-leftTop.y); return 2*(width+height); }private: CMyPoint leftTop,rightBottom;};Void main(){ CMyShape *myShape=NULL; CMyCircle *myCirCle=newCMyCircle(CMyPoint(5,5),10); CMyRectangle *myRectangle=new CMyRectangle(CMyPoint(0,0),CMyPoint(30,30)); //********3******** cout<<"myCircle:"<<"Area="<<myShape->GetArea()<<"\t" <<"Girth="<<myShape->GetGirth()<<endl; //********4******** cout<<"myRectangle:"<<"Area="<<myShape->GetArea()<<"\t" <<"Girth="<<myShape->GetGirth()<<endl;}
【正确答案】正确答案:(1)添加语句:virtual double GetArea()=0; (2)添加语句:virtual double GetGirth()=0; (3)添加语句:myShape=mycircle; (4)添加语句:myshape=myRectangle;
【答案解析】解析:(1)第1个标识下声明纯虚函数,纯虚函数的定义格式为:virtual<函数类型><函数名>(<参数表>)=0,由程序后面的函数体实现可知求面积纯虚函数的函数名为GetArea0,因此第1个标识下应添加“virtual double GetArea0=0;”。 (2)声明格式和(1)相同,由求周长的函数具体实现可知该函数的名为GetGirth0,因此第2个标识下应添加“virtual double GetGirth()=0;” (3)主函数中定义了CMyShape类对象指针myShape,CMyCircle类对象指针myCircle,CMyRectangle类对象指针myRectangle,由类继承关系知,在调用子类的构造函数的时候,编译器会自动调用父类的默认构造函数来初始化父类,因此在实例化类CMyRectangle和类CMyCircle的实例的时候,抽象父类CMyShape的默认构造函数会先被调用,因此在屏幕上先输出“在CMyShape类构函数造内”,然后输出“在CMyCircle类构造函数内”,实例化CMyRectangle对象的过程也是如此。同时由纯虚函数的性质知,抽象基类不需要实现纯虚函数,它的实现是在子类中完成的,但是通过用子类实例隐式转换成基类实例,可以使得基类实例具有子类实例的特性,因此可以访问子类的成员函数,myShape是基类指针,其虚函数GetArea0和GetGirth()没有实现,要求程序输出面积值和周长值,只可能是myShape指向子类对象,调用子类的函数GetArea()和GetGirth()打印输出,显然第3个标识下是myShape指向子类CM:yCircle对象,即myShape=myCircle;。 (4)同理第4个标识下myShape指向子类CMyRectangle对象,即第4个标识下应添加“myShape=myRectangle;”。