使用VC6打开考生文件夹下的源程序文件modi3.cpp,要求编写一个CMyShape类,含有求面积求周长等纯虚函数。然后编写一个CMyRectangle类和CMyCirele类继承CMyShape,并实现求面积、求周长的两个函数。在mainC函数中测试得

admin2015-07-20  75

问题 使用VC6打开考生文件夹下的源程序文件modi3.cpp,要求编写一个CMyShape类,含有求面积求周长等纯虚函数。然后编写一个CMyRectangle类和CMyCirele类继承CMyShape,并实现求面积、求周长的两个函数。在mainC函数中测试得到下面的结果:
    在CMyShape类构函数造内
    在CMyCircle类构造函数内
    在CMyShape类构造函数内
    在CMyRectangle类构造函数内
    myCircle:Area=314.159    Girth=62.8319
    myRectangle:Area=900 Ginh=120
  具体要求如下:
(1)定义求面积纯虚函数,请在注释∥********1********之处添加适当的语句。
(2)定义求周长纯虚函数,请在注释∥********2********之处添加适当的语句。
(3)请在注释∥********3********和∥********4*******之处添加适当的语句。
注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。
#include
#include
#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类构造函数内”<    ∥********1********
    ∥********2********
protected:
};
class CMyCircle:public CmyShape
{
public:
    CMyCircle(CMyPoint i,double
J):CMyShape(),arcCenter(i),
radius(j){
    cout<    }
    double GetArea()
    {
    return PI*radius*radius,
    }
    double GetGirth()
    {
    return 2*PI*radiUS,
    }
private:
    CMyPoint arcCenter;
    double radius ;
    };
    class CMyRectangle:public
    CmyShape
    {
    public:
    CMyRectangle(CMyPoint
it,CMyPoint  rb):leftTop(It),
rightBottom(rb),CMyShape(){
    cout<<“在  cMyRectangle
类构造函数内”<    }
    Double GetArea()
    {
    int width=abs
(rightBot Lom.x—leftTop.x);
    int height=abs
  (rightBottom.y—leftTop.y);
    Return width*height ;
    }
    double GetGirth()
    {
    int wi dth=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=new
CMyCircle(CMyPoint(5,5),10);
    CMyRectangle*myRectangle=new CMyRectangle(CMyPoint(0,0),
CMyPoint(30,30));
    ∥********3********
    cout<<”myCircle:”<<”Area=”
<GetArea()<<“\t”
    <<”Girth=”<
GetGirth()<    ∥********4********
    cout<<“myRectangle:”<<“Are、a=”<GetArea()<<“\t”
    <<“Girth=”<
GetGirth()<}

选项

答案(1)添加语句:virtual double GetArea()=0; (2)添加语句:virtual double GetGirth()=0; (3)添加语句:myShape=myCircle; (4)添加语句:myShape=myRectangie;

解析 (1)第1个标识下声明纯虚函数,纯虚函数的定义格式为:vimml<函数类型><函数名>(<参数表>)=0,由程序后面的函数体实现可知求面积纯虚函数的函数名为GetArea0,因此第1个标识下应添加“virtual doubleGetArea0=0;”。
(2)声明格式和(1)相同,由求周长的函数具体实现可知该函数的名为GetGirth(),因此第2个标识下应添加“virtual double GetGirth0=0;”
(3)主函数中定义了CMyShape类对象指针myShape,CMyCircle类对象指针myCircle,CMyRectangle类对象指针myRectangle,由类继承关系知,在调用子类的构造函数的时候,编译器会自动调用父类的默认构造函数来初始化父类,因此在实例化类CMyRectangle和类CMyCircle的实例的时候,抽象父类CMyShape的默认构造函数会先被调用,因此在屏幕上先输出“在CMyShape类构函数造内”,然后输出“在CMyCircle类构造函内”,实例化CMyRectangle对象的过程也是如此。同时由纯虚函数的性质知,抽象基类不需要实现纯虚函数,它的实现是在子类中完成的,但是通过用子类实例隐式转换成基类实例,可以使得基类实例具有子类实例的特性,因此可以访问子类的成员函数,myShape是基类指针,其虚函数GetArea0和GetGirth0没有实现,要求程序输出面积值和周长值,只可能是myShape指向子类对象,调用子类的函数GetAreaO和OetOirth0打印输出,显然第3个标识下是myShape指向子类CMyCircle对象,即myShape--myCircle;。
(4)同理第4个标识下myShape指向子类CMyRectangle对象,即第4个标识下应添加“myShape=myRectangle;”。
转载请注明原文地址:https://kaotiyun.com/show/dCNp777K
0

最新回复(0)