删除文章

确定要删除这篇文章吗?

取消
确定

如何为包含指向(抽象)基类的指针的类定义拷贝构造函数或复制操作符

     阅读(365)  2017-10-24 20:04:06


#include <iostream>
using namespace std;

// 如何为包含指向(抽象)基类的指针的类定义拷贝构造函数或复制操作符
class Shape
{
public:
    Shape()
    {
        cout << "Shape::Shape()" << endl;
    }
    virtual ~Shape()
    {
        cout << "Shape::~Shape()" << endl;
    }
    virtual Shape* clone() const = 0;
};

class Circle : public Shape
{
public:
    Circle()
    {
        cout << "Circle::Circle()" << endl;
    }
    ~Circle()
    {
        cout << "Circle::~Circle()" << endl;
    }
    virtual Shape* clone() const
    {
        return new Circle(*this);
    }
};

class Square : public Shape
{
public:
    Square()
    {
        cout << "Square::Square()" << endl;
    }
    ~Square()
    {
        cout << "Square::~Square()" << endl;
    }
    virtual Shape* clone() const
    {
        return new Square(*this);
    }
};

class Fred
{
public:
    Fred(Shape* p) : p_(p)
    {
        cout << "Fred::Fred()" << endl;
    }
    ~Fred()
    {
        cout << "Fred::~Fred()" << endl;
        delete p_;
    }
    Fred(const Fred& f) : p_(f.p_->clone())
    {
    }
    Fred& operator =(const Fred& f)
    {
        if (this != &f)
        {
            Shape* p2 = f.p_->clone();
            delete p_;
            p_ = p2;
        }
        return *this;
    }

private:
    Shape* p_;
};

int _tmain(int argc, _TCHAR* argv[])
{
    Shape *circle = new Square();
    Fred *fred = new Fred(circle);

    delete fred;
    //delete circle;

    system("pause");
    return 0;
}


文章评论

Keep it simple,stupid
文章数
300
总访问量
443081
今日访问
970
最近评论

xuehaoyun : 很不错,来围观一下
tujiaw : 抱歉csdn code服务关闭了,这个代码我也找不到了
于淞 : 你好,这个文章的源码能分享一下吗,songsong9181@163.com,谢谢了 上面的写错了
于淞 : 你好,这个文章的源码能分享一下吗,838106303@163.com,谢谢了 上面的链接不能用了
tujiaw : 多谢多谢
essaypinglun college-paper.org : 很好的博客,赞赞
Folly : 这个实现有点奇怪,Qt为什么没有统一的比对方法。
过多s : alert("hello, world!")
tujiaw : 还不错哦
回到顶部