关于#c++多态与虚函数#的问题,如何解决?

补全以下程序,实现基类Point和子类Square,Circle等的多态关系


#include<iostream>
using namespace std;
//C++的多态与虚函数 
//基类Point
class Point {
    public:
        Point(int xa, int yb) { //有参构造函数
            x = xa;
            y = yb;
        }
        Point(){
            x = 0;
            y = 0;
        } 
        //定义虚函数display(),满足子类继承时的多态效应。
        //补全代码 
        



        //----------------------------------------------------
        //由于在Point基类阶段,无法实现实际的求面积方法,因此将get_area()设计为纯虚函数。
        //请补全代码 
        
        

        //------------------------------------------------
        //析构函数通常定义为虚函数
        //请补全析构函数头 
        
        
        //--------------------------------
        {
            cout << "Point destructor" << endl;
        }
    protected:
        int x;  //x坐标
        int y;  //y坐标
};
//Square继承了Point 
class Square : public Point{
    public:
        Square(int xa, int xb, int len):Point(xa,xb),length(len){
        }
        Square()
        {
            length = 1;
        }
        void display(){
            //显示一个方形
            cout<<"调用Square的display函数,显示一个正方形.\n"<< "坐标:(" << x << ", " << y << "), 边长:" << length <<endl;
        }
        //补全代码,实现自己的求面积函数get_area 
        
        

        //-------------------------------------- 
        //析构函数通常定义为虚函数
        //请补全析构函数头 
        
        
        //-------------------------------------- 
        {
            cout << "Square destructor" << endl;
        }
    protected:
        int length;
};
//Circle继承了Point 
class Circle: public Point {
    public:
        Circle(int xa, int xb, int r):Point(xa,xb) {
            radius = r;
        }
        Circle(){
            radius = 1;
        }
        void display() { //显示一个圆
            cout<<"调用Circle的display函数,显示一个圆.\n"<< "坐标:(" << x << ", " << y << "), 半径:" << radius <<endl;
        }
        //补全代码,实现自己的求面积函数get_area
        
        

        //------------------------------------------
        //析构函数通常定义为虚函数
        //请补全析构函数头 
        
        

        //----------------------------------------------- 
        {
            cout << "Circle destructor" << endl;
        }
    protected:
        int radius;
};

//编写一个Triangle类,继承Point,属性包含底边长和高
//并有自己的有参,无参构造函数,display函数和get_area函数,以及析构函数 
//此处补全代码: 













//--------------------------------------------------------------- 

//显示一个图形的通用函数Disp
void Disp(/*补全代码,填上参数,仔细思考这里应该填写什么类型的 对象?引用?指针?*/)
{
    p.display();
}
//显示一个图形面积的通用函数:Area_of_shape 
void Area_of_shape(/*补全代码,填上参数,仔细思考这里应该填写什么类型的 对象?引用?指针?*/)
{
    cout << s->get_area() << endl;
}
//函数create_shapes实现在堆内存中,动态生成一组图形,并返回首地址。
//option表示图形类型,1为方形,2为圆形,3为三角形 
//num为生成图形的数量 
Point* create_shapes(int option, int num)
{
    //补全代码,实现功能 
    //建议使用switch,并注意new对象数组的用法。
    
    //--------------------------------------------    
} 
int main() {
    //在堆内存中生成不同的图形。
    //定义基类图形指针
    Point *p; 
    int num;//个数 
    //输入即将生成的方形个数
    cin >> num;
    //生成一组方形 
    p = create_shapes(1, num);
    //依次显示这组方形的基本信息,以及面积。 
    for(int i = 0; i < num; i++)
    {
        
        //注意:p作为基类指针,在指向子类数组时,
        //其对于属性的作用范围仍局限在子类中的基类属性。
        //若直接通过+i或[i]形式,会造成内存指向的错位。
        //因此,需要想办法将其强制转换为子类类型的指针。
        //下同 
        //显示基本信息
        Disp(/*补全代码,填写实参*/);
        //显示面积值
        Area_of_shape(/*补全代码,填写实参*/); 
        
    }
    //注销
    //注意,由于涉及到数组的注销,因此注销时,基类指针,也需要转换为子类指针才能顺利注销,下同。 
    //请补齐注销代码 
    
    
    //--------------------------------
    //输入即将生成的圆形个数
    cin >> num;
    //生成一组圆形 
    p = create_shapes(2, num);
    //依次显示这组圆形的基本信息,以及面积。 
    for(int i = 0; i < num; i++)
    {
        Disp(/*补全代码,填写实参*/);
        Area_of_shape(/*补全代码,填写实参*/); 
    }
    //注销 
    //请补齐注销代码 
    
    
    //-------------------------------- 
    //输入即将生成的三角形个数
    cin >> num;
    //生成一组三角形 
    p = create_shapes(3, num);
    //依次显示这组三角形的基本信息,以及面积。 
    for(int i = 0; i < num; i++)
    {
        Disp(/*补全代码,填写实参*/);
        Area_of_shape(/*补全代码,填写实参*/); 
    }
    //注销 
    //请补齐注销代码 
    
    
    //---------------------------------------------------- 
    return 0;
}

测试输入:4 91 51 2 32
预期输出:
平均值:44.0
最大值:91

测试输入:
1
2
2
预期输出:
调用Square的display函数,显示一个正方形.
坐标:(0, 0), 边长:1
1
Square destructor
Point destructor
调用Circle的display函数,显示一个圆.
坐标:(0, 0), 半径:1
3.14
调用Circle的display函数,显示一个圆.
坐标:(0, 0), 半径:1
3.14
Circle destructor
Point destructor
Circle destructor
Point destructor
调用Triangle的display函数,显示一个三角形.
坐标:(0, 0), 底边长:1, 高:1
0.5
调用Triangle的display函数,显示一个三角形.
坐标:(0, 0), 底边长:1, 高:1
0.5
Triangle destructor
Point destructor
Triangle destructor
Point destructor

运行结果:

img

代码:

#define  _CRT_SECURE_NO_WARNINGS 1

#include<iostream>
using namespace std;
//C++的多态与虚函数 
//基类Point
class Point {
public:
    Point(int xa, int yb) { //有参构造函数
        x = xa;
        y = yb;
    }
    Point() {
        x = 0;
        y = 0;
    }
    //定义虚函数display(),满足子类继承时的多态效应。
    //补全代码 
    virtual void display() {
        cout << "(" << x << "," << y << ")";
    }



    //----------------------------------------------------
    //由于在Point基类阶段,无法实现实际的求面积方法,因此将get_area()设计为纯虚函数。
    //请补全代码 
    virtual double get_area() = 0;


    //------------------------------------------------
    //析构函数通常定义为虚函数
    //请补全析构函数头 

    virtual ~Point()
    //--------------------------------
    {
        cout << "Point destructor" << endl;
    }
protected:
    int x;  //x坐标
    int y;  //y坐标
};
//Square继承了Point 
class Square : public Point {
public:
    Square(int xa, int xb, int len) :Point(xa, xb), length(len) {
    }
    Square()
    {
        length = 1;
    }
    void display() {
        //显示一个方形
        cout << "调用Square的display函数,显示一个正方形.\n" << "坐标:(" << x << ", " << y << "), 边长:" << length << endl;
    }
    //补全代码,实现自己的求面积函数get_area 
    double get_area()
    {
        return length * length;
    }


    //-------------------------------------- 
    //析构函数通常定义为虚函数
    //请补全析构函数头 

    ~Square()
    //-------------------------------------- 
    {
        cout << "Square destructor" << endl;
    }
protected:
    int length;
};
//Circle继承了Point 
class Circle : public Point {
public:
    Circle(int xa, int xb, int r) :Point(xa, xb) {
        radius = r;
    }
    Circle() {
        radius = 1;
    }
    void display() { //显示一个圆
        cout << "调用Circle的display函数,显示一个圆.\n" << "坐标:(" << x << ", " << y << "), 半径:" << radius << endl;
    }
    //补全代码,实现自己的求面积函数get_area
    double get_area()
    {
        return 3.14 * radius * radius;
    }


    //------------------------------------------
    //析构函数通常定义为虚函数
    //请补全析构函数头 


    ~Circle()
    //----------------------------------------------- 
    {
        cout << "Circle destructor" << endl;
    }
protected:
    int radius;
};

//编写一个Triangle类,继承Point,属性包含底边长和高
//并有自己的有参,无参构造函数,display函数和get_area函数,以及析构函数 
//此处补全代码: 


class Triangle : public Point {

public:
    Triangle(int xa, int xb, int len, int hei) :Point(xa, xb) {
        length = len;
        height = hei;
    }

    Triangle() {
        length = 1;
        height = 1;
    }

    void display() { //显示一个三角形
        cout << "调用Triangle的display函数,显示一个三角形.\n" << "坐标:(" << x << ", " << y << "), 底边长:" << length <<",高:"<<height << endl;
    }
    //补全代码,实现自己的求面积函数get_area
    double get_area()  {
        return 0.5 * length * height;
    }

    ~Triangle(){
        cout << "Triangle destructor" << endl;
    }

protected:
    int length,height; //底边长和高
};



//--------------------------------------------------------------- 

//显示一个图形的通用函数Disp
void Disp( Point &p /*补全代码,填上参数,仔细思考这里应该填写什么类型的 对象?引用?指针?*/)
{
    p.display();
}
//显示一个图形面积的通用函数:Area_of_shape 
void Area_of_shape(Point* s /*补全代码,填上参数,仔细思考这里应该填写什么类型的 对象?引用?指针?*/)
{
    cout << s->get_area() << endl;
}
//函数create_shapes实现在堆内存中,动态生成一组图形,并返回首地址。
//option表示图形类型,1为方形,2为圆形,3为三角形 
//num为生成图形的数量 
Point* create_shapes(int option, int num)
{
    //补全代码,实现功能 
    //建议使用switch,并注意new对象数组的用法。
    Point* arr = 0;
    int i = 0;

    //--------------------------------------------   
    switch (option)
    {
    case 1:
        arr = (Point*)(new Square[num]); 
        break;
    case 2:
        arr = (Point*)(new Circle[num]);
        break;
    case 3:
        arr = (Point*)(new Triangle[num]);
        break;
    default:
        break;
    }
    return arr;
}
int main() {
    //在堆内存中生成不同的图形。
    //定义基类图形指针
    Point* p;
    int num;//个数 
    //输入即将生成的方形个数
    cin >> num;
    //生成一组方形 
    p = create_shapes(1, num);
    //依次显示这组方形的基本信息,以及面积。 
    for (int i = 0; i < num; i++)
    {

        //注意:p作为基类指针,在指向子类数组时,
        //其对于属性的作用范围仍局限在子类中的基类属性。
        //若直接通过+i或[i]形式,会造成内存指向的错位。
        //因此,需要想办法将其强制转换为子类类型的指针。
        //下同 
        //显示基本信息
        Disp(((Square*)p)[i] /*补全代码,填写实参*/);
        //显示面积值
        Area_of_shape( &((Square*)p)[i]/*补全代码,填写实参*/);

    }
    //注销
    //注意,由于涉及到数组的注销,因此注销时,基类指针,也需要转换为子类指针才能顺利注销,下同。 
    //请补齐注销代码 
    delete[] (Square*)p;
    p = 0;

    //--------------------------------
    //输入即将生成的圆形个数
    cin >> num;
    //生成一组圆形 
    p = create_shapes(2, num);
    //依次显示这组圆形的基本信息,以及面积。 
    for (int i = 0; i < num; i++)
    {
        Disp(((Circle*)p)[i]/*补全代码,填写实参*/);
        Area_of_shape(&((Circle*)p)[i] /*补全代码,填写实参*/);
    }
    //注销 
    //请补齐注销代码 
    delete[](Circle*)p;
    p = 0;

    //-------------------------------- 
    //输入即将生成的三角形个数
    cin >> num;
    //生成一组三角形 
    p = create_shapes(3, num);
    //依次显示这组三角形的基本信息,以及面积。 
    for (int i = 0; i < num; i++)
    {
        Disp(((Triangle*)p)[i]/*补全代码,填写实参*/);
        Area_of_shape(&((Triangle*)p)[i]/*补全代码,填写实参*/);
    }
    //注销 
    //请补齐注销代码 
    delete[](Triangle*)p;
    p = 0;

    //---------------------------------------------------- 
    return 0;
}

你看看这个,如果有用,麻烦点个采纳,谢谢~~
https://ask.csdn.net/questions/7964435?spm=1005.2025.3001.5141

源于ChatGPT 仅供参考

本题涉及到多态和虚函数的使用,需要仔细理解。下面是完整的代码实现:

```c++
#include<iostream>
using namespace std;
//C++的多态与虚函数 
//基类Point
class Point {
public:
    Point(int xa, int yb) { //有参构造函数
        x = xa;
        y = yb;
    }
    Point() {
        x = 0;
        y = 0;
    }
    //定义虚函数display(),满足子类继承时的多态效应。
    virtual void display() {
        cout << "调用Point的display函数,显示一个点.\n" << "坐标:(" << x << ", " << y << ")" << endl;
    }
    //----------------------------------------------------
    //由于在Point基类阶段,无法实现实际的求面积方法,因此将get_area()设计为纯虚函数。
    virtual double get_area() = 0;
    //------------------------------------------------
    //析构函数通常定义为虚函数
    virtual ~Point() {
        cout << "Point destructor" << endl;
    }
protected:
    int x;  //x坐标
    int y;  //y坐标
};
//Square继承了Point 
class Square : public Point {
public:
    Square(int xa, int xb, int len) :Point(xa, xb), length(len) {
    }
    Square()
    {
        length = 1;
    }
    void display() {
        //显示一个方形
        cout << "调用Square的display函数,显示一个正方形.\n" << "坐标:(" << x << ", " << y << "), 边长:" << length << endl;
    }
    //实现自己的求面积函数get_area
    double get_area() {
        return length * length;
    }
    //-------------------------------------- 
    //析构函数通常定义为虚函数
    virtual ~Square() {
        cout << "Square destructor" << endl;
    }
protected:
    int length;
};
//Circle继承了Point 
class Circle : public Point {
public:
    Circle(int xa, int xb, int r) :Point(xa, xb) {
        radius = r;
    }
    Circle() {
        radius = 1;
    }
    void display() { //显示一个圆
        cout << "调用Circle的display函数,显示一个圆.\n" << "坐标:(" << x << ", " << y << "), 半径:" << radius << endl;
    }
    //实现自己的求面积函数get_area
    double get_area() {
        return 3.14 * radius * radius;
    }
    //------------------------------------------
    //析构函数通常定义为虚函数
    virtual ~Circle() {

        cout << "Circle destructor" << endl;
    }
protected:
    int radius;
};

//编写一个Triangle类,继承Point,属性包含底边长和高
//并有自己的有参,无参构造函数,display函数和get_area函数,以及析构函数 
class Triangle : public Point {
public:
    Triangle(int xa, int xb, int b, int h) :Point(xa, xb), base(b), height(h) {
    }
    Triangle()
    {
        base = 1;
        height = 1;
    }
    void display() {
        //显示一个三角形
        cout << "调用Triangle的display函数,显示一个三角形.\n" << "坐标:(" << x << ", " << y << "), 底边:" << base << ",高:" << height << endl;
    }
    //实现自己的求面积函数get_area
    double get_area() {
        return 0.5 * base * height;
    }
    //------------------------------------------
    //析构函数通常定义为虚函数
    virtual ~Triangle() {

        cout << "Triangle destructor" << endl;
    }
protected:
    int base;
    int height;
};

//显示一个图形的通用函数Disp
void Disp(Point& p)
{
    p.display();
}
//显示一个图形面积的通用函数:Area_of_shape 
void Area_of_shape(Point* s)
{
    cout << s->get_area() << endl;
}
//函数create_shapes实现在堆内存中,动态生成一

您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632