写个代码都白给 2019-06-22 12:07 采纳率: 100%
浏览 640
已采纳

关于继承的题,如何做到题目要求?

以下为定义的图形继承体系:
class Shape{
public:
// . . .
virtual double area(){}
};
class Circle:public Shape{
public:
double area(){…}
// . . .
};
class Triangle:public Shape{
public:
double area(){…}
// . . .
};
// . . .
以下为容器类:
class Manage{
shape *a[100];
public:
// . . .
}
要求完成Manage类的拷贝构造函数,实现深度拷贝;可以改动所有的类,并给出main函数测试程序。
(最好能教一下)

  • 写回答

2条回答 默认 最新

  • threenewbee 2019-06-22 12:27
    关注
    // Q766790.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    
    
    #include <iostream>
    using namespace std;
    
    class Shape{
    public:
        virtual double area() = 0;
    };
    
    class Circle: public Shape{
    public:
        double r;
        double area(){
            return 3.14 * r * r;
        }
    };
    
    class Triangle: public Shape{
    public:
        double h;
        double e;
        double area(){
            return h * e / 2.0;
        }
    };
    
    class Manage{
    private:
        Shape *a[100];
        int n;
    public:
        int GetCount()
        {
            return n;
        }
        Manage() { n = 0; }
        void Add(Shape * shp)
        {
            a[n++] = shp;
        }
        Shape* Get(int index)
        {
            return a[index];
        }
        Manage(Manage& other)
        {
            cout << "copy ctor" << endl;
            for (int i = 0; i < other.n; i++)
                a[i] = other.a[i];
            n = other.n;
        }
    };
    
    int main()
    {
        Circle c1, c2;
        c1.r = 1.2;
        c2.r = 10;
        Triangle t1, t2;
        t1.e = 1;
        t1.h = 2;
        t2.e = 10;
        t2.h = 5;
        Manage m1;
        m1.Add(&c1);
        m1.Add(&c2);
        m1.Add(&t1);
        Manage m2 = m1;
        m2.Add(&t2);
        cout << m1.GetCount() << endl;
        cout << m2.GetCount() << endl;
        for (int i = 0; i < m2.GetCount(); i++)
            cout << "area: " << m2.Get(i)->area() << endl;
        return 0;
    }
    

    copy ctor
    3
    4
    area: 4.5216
    area: 314
    area: 1
    area: 25
    Press any key to continue

    稍微讲解一下,具体你要看书
    构造函数的作用是构造一个对象
    它的定义方式是,不要写返回值类型,函数名和类同名
    Manage() { n = 0; }
    Manage(Manage & other)
    {
    for (int i = 0; i < other.n; i++)
    a[i] = other.a[i];
    n = other.n;
    }
    这两个就是构造函数
    拷贝构造函数的意思是,带有一个参数是另一个这个类的对象
    Manage(Manage & other)
    这个就是拷贝构造函数
    Manage m2 = m1;
    这里调用了拷贝构造函数
    也可以写
    Manage m2(m1);
    深度拷贝的意思是,将原来的对象的数组的值依次拷贝过来,而不是仅仅让这个对象的a指向被拷贝的那个对象。
    可以看出,给m2再增加shape,则m1的数量不会发生变化。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站