【问题标题】:Creating clone of an object not working with virtual base class创建对象的克隆不适用于虚拟基类
【发布时间】:2010-09-30 14:10:57
【问题描述】:
#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 的帖子有关。

在第一个链接中,Space_C0wb0y 说

“由于克隆方法是一种 对象的实际类,它可以 还创建一个深拷贝。它可以访问 它所属的类的所有成员 到,所以那里没有问题。”

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

【问题讨论】:

  • Clone() 不是你在 C++ 中看到的(经常)。您要移植 Java 应用程序吗?
  • 没有。我正在尝试在 C++ 中进行深度复制,一些 C++ 程序员创建了他们自己的 clone() 函数,如上所示。当您点击“我的问题与这个、这个和这个帖子有关”中显示的链接时,会更清楚。 (引号中的句子显示在我上面的问题中)

标签: c++ virtual deep-copy shallow-copy


【解决方案1】:

好吧,你的复制构造函数什么都不做,所以你的克隆方法在复制过程中什么也不做。

Derived(const Derived&amp;) {}

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

【讨论】:

  • +1!该代码不会复制任何内容。深拷贝需要在拷贝构造函数中手动完成。
  • 我明白了。因此,使用 clone 方法的唯一目的是返回 Base 类型的指针。无论如何都需要手动复制构造。叹!感谢您的回复:)
  • 小补充:默认的拷贝构造函数创建一个浅拷贝。如果您需要某些内容的浅拷贝,则无需手动执行。
  • 我需要一个深拷贝。这就是为什么我展示了Something类的指针。
  • @Nav:我明白这一点。我只是想指出,浅拷贝不需要实现拷贝构造函数(用于记录)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
相关资源
最近更新 更多