问题 填空题

使用VC++6.0打开考生文件夹下的源程序文件3.cpp,要求编写一个CMyShape类,含有求面积、周长等的纯虚函数,然后编写一个CRectangle类和CCircle类继承CMyShape,并实现求面积、周长的两个函数。在main函数中测试得到下面的结果:
在CMyShape类构函数造内
在CCircle类构造函数内
在CMyShape类构造函数内
在CRectangle类构造函数内
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.1415926
class CMyPoint

public:
int x,y;
CMyPoint(int tx,int ty):x(tx),y(ty)

class CMyShape

public:
CMyShape()cout<<"在CMyShape类构造函数内"<<end1;
//********1********
//********2********
protected:

class CCircle:public CMyShape

public:
CCircle(CMyPoint i,double j):CMyShape(),arcCenter(i),radius(j)

cout<<"在CCircle类构造函数内"<<end1;

double GetArea()

return PI *radius *radius;

double GetGirth()

return 2*PI*radius;

private:
CMyPoint arcCenter;
double radius;

class CRectangle:public CMyShape

public:
CRectangle(CMyPoint lt,CMyPoint rb):leftTop(lt),rightBottom(rb),CMyShape()

cout<<"在CRectangle类构造函数内"<<end1;

double GetArea()

int width=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;
CCircle *myCircle=new CCircle(CMyPoint(5,5),10);
CRectangle *myRectangle=new CRectangle(CMyPoint(0,0),CMyPoint(30,30));
//********3********
cout<<"myCircle:"<<"Area="<<myShape—>GetArea()<<"\t"<<"Girth="<<myShape—>GetGirth()<<end1;
//********4********
cout<<"myRectangle:"<<"Area="<<myShape—>GetArea()<<"\t"<<"Girth="<<myShape—>GetGirth()<<end1;

答案

参考答案:应添加“myShape=myRectangle;”。

解析: 本题在第1处声明纯虚函数,纯虚函数的定义格式为“virtual<函数类型><函数名>(<参数表>)=0”,由程序后面的函数体实现可知求面积纯虚函数的函数名称为GetArea,因此第1处应添加“virtual double GetArea()=0;”。声明格式和1)相同,由求周长的函数具体实现可知该函数的名称为GetGirth,因此第2处应添加“virtual double GetGirth()=0;”。主函数中定义了CMyShape类对象指针myShape,CCircle类对象指针myCirele,CRectangle类对象指针myRectangle。由类继承关系知,在调用子类的构造函数时,编译器会自动调用父类的默认构造函数来初始化父类,因此在实例化类CRectangle和类CCircle的实例时,抽象父类CMyShape的默认构造函数会先被调用,因此在屏幕上先输出“在CMyShape类构函数造内”,然后输出“在CCirck类构造函数内”,实例化CRectangle对象的过程也是如此。同时由纯虚函数的性质知,抽象基类不需要实现纯虚函数,它的实现是在子类中完成的,但通过用子类实例隐式转换成基类实例,可以使得基类实例具有子类实例的特性,因此可以访问子类的成员函数,myShape是基类指针,其虚函数GetArea和GetGirth没有实现,要求程序输出的面积值和周长值,只可能是myShape指向子类对象,调用子类的函数GetArea和GetGirth打印输出,显然在第3处是myShape指向子类CCircle对象,即“myShape=myCircle;”。同理第4处myShape指向子类CRectangle对象,即第4处应添加“myShape=myRectangle;”。

单项选择题
单项选择题