Создание клона объекта, не работающего с виртуальным базовым классом - PullRequest
0 голосов
/ 30 сентября 2010
#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

Мой вопрос связан с этим , этим и этим сообщением.

В первой ссылке Space_C0wb0y говорит:

"Поскольку метод clone является методом фактического класса объекта, он также может создавать глубокую копию. Он может получить доступ ко всемчленам класса, к которому он принадлежит, так что проблем там нет. "

Я не понимаю, как может происходить глубокая копия.В вышеприведенной программе даже мелкой копии не происходит. Мне нужно, чтобы он работал, даже если базовый класс является абстрактным классом .Как я могу сделать глубокую копию здесь?Помогите пожалуйста?

1 Ответ

5 голосов
/ 30 сентября 2010

Ваш конструктор копирования ничего не делает, поэтому ваш метод клонирования ничего не делает в отношении копирования.

см. Строку Derived(const Derived&) {}

РЕДАКТИРОВАТЬ: если вы добавите код для копирования по назначению всех членов Derived, он станет мелкой копией. Если вы также скопируете (создав новый экземпляр) свой экземпляр Something, он станет глубокой копией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...