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

admin2020-05-14  50

问题 使用VC6打开考生文件夹下的源程序文件modi3.cpp,要求编写一个CMyShape类,含有求面积求周长等纯虚函数。然后编写一个CMyRectangle类和CMyCircle类继承CMyShape,并实现求面积、求周长的两个函数。在main()函数中测试得到下面的结果:
    在CMyShape类构函数造内
    在CMyCircle类构造函数内
    在CMyShape类构造函数内
    在CMyRectangle类构造函数内
    myCircle:Area=314.159    Girth=62.8319
    myRectangle:Area=900 Ginh=120
  具体要求如下:
  (1)定义求面积纯虚函数,请在注释//********1********之处添加适当的语句。
  (2)定义求周长纯虚函数,请在注释//********2********之处添加适当的语句。
  (3)请在注释//********3********和//********4********之处添加适当的语句。
    注意:除在指定位置添加语句之外,请不要改动程序中的其他内容。
    1    #include
    2    #include
    3    #define PI    3.1415926
    4    class CMyPoint
    5    {
    6    public:
    7    int x,y;
    8    CMyPoint(int tx,int ty):
        x(tx),y(ty){}
    9    };
    10  class CMyShape
    11  {
    12   public:
    13    CMyShape(){cout<<"在
        CMyShape类构造函数内"<    14    //********1********
    15
    16    //********2********
    17
    18    protected:
    19    };
    20  class CMyCircle:public CmyShape
    21  {
    22   public:
    23    CMyCircle(CMyPoint i,double
    j):CMyShape(),arcCenter(i),
    radius(J){
    24    cout<<"在CMyCircle类构
    造函数内"<    25    }
    26 double GetArea()
    27    (
    28    return PI*radius*radius ;
    29    )
    30   double GetGirth()
    31    {
    32    return 2*PI*radius ;
    33    }
    34    private:
    35    CMyPoint arcCenter ;
    36   double radius ;
    37  };
    38  class CMyRectangle:public
    CmyShape
    39    {
    40   public:
    41    CMyRectangle(CMyPoint
    it,CMyPoint  rb):leftTop(it),
    rightBottom(rb),CMyShape(){
     42    cout<<"在  cMyRectangle
    类构造函数内"<     43    }
     44 Double GetArea()
     45    {
     46    int width=abs
    (rightBott0m.x0leftTop.X);
     47    int height=abs
    (rightBottom.y-leftTop.Y);
     48    Return width*height;
     49    }
     50 double GetGirth()
     51    {
     52    int width=abs
    (rightBottom.x-leftTop.X);
     53    int heigh七=abs
    (rightBottom.y-leftTop.y);
     54    return 2*(width+height);
     55    }
     56 private:
     57    CMyPoint leftTop,rightBottom;
     58  };
     59  void main()
     60    {
     61    CMyShape  *myShape=NULL ;
     62    CMyCircle *myCircle=new
    CMyCircle(CMyPoint(5,5),10);
     63    CMyRectangle*myRectangle=
    new CMyRectangle(CMyPoint(0,0),
    CMyPoint(30,30));
     64    //********3********
     65
     66    cout<<"myCircle:"<<"Area="
    <GetArea()<<"\t"
     67    <<"Girth="<
    GetGirth()<     68    //********4********
     69
     70    cout<<"myRectangle:"<<"Are
    a="<GetArea()<<"\t"
     71    <<"Girth="<
    GetGirth()<     72  }

选项

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

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

最新回复(0)