0
#include<iostream>
using namespace std;

class Something
{
  public:
  int j;
  Something():j(20) {cout<<"Something initialized. j="<<j<<endl;}
};

class Base
{
  private:
    Base(const Base&) {}
  public:
    Base() {}
    virtual Base *clone() { return new Base(*this); }
    virtual void ID() { cout<<"BASE"<<endl; }
};

class Derived : public Base
{
  private:
    int id;
    Something *s;
    Derived(const Derived&) {}
  public:
    Derived():id(10) {cout<<"Called constructor and allocated id"<<endl;s=new Something();}
    ~Derived() {delete s;}
    virtual Base *clone() { return new Derived(*this); }
    virtual void ID() { cout<<"DERIVED id="<<id<<endl; }
    void assignID(int i) {id=i;}
};


int main()
{
        Base* b=new Derived();
        b->ID();
        Base* c=b->clone();
        c->ID();
}//main

运行时:

Called constructor and allocated id
Something initialized. j=20
DERIVED id=10
DERIVED id=0

我的问题与thisthisthis post有关。

在第一个链接中, Space_C0wb0y 说

“由于clone-method是对象实际类的方法,它也可以创建一个深拷贝。它可以访问它所属的类的所有成员,所以没有问题。”

我不明白深拷贝是如何发生的。在上面的程序中,甚至没有发生浅拷贝。即使 Base 类是抽象类,我也需要它工作。我怎样才能在这里做一个深拷贝?请帮忙?

4

1 回答 1

5

好吧,您的复制构造函数什么都不做,所以您的 clone 方法在复制方面什么也不做。

见线Derived(const Derived&) {}

编辑:如果您通过分配 Derived 的所有成员来添加要复制的代码,它将成为浅拷贝。如果您还复制(通过创建新实例)Something 的实例,它将成为深层副本。

于 2010-09-30T14:15:49.730 回答