#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
Мой вопрос связан с this, this и this пост.
В первой ссылке, Space_C0wb0y говорит
"Since the clone-method is a method of the actual class of the object, it can also create a deep-copy. It can access all members of the class it belongs to, so no problems there."
Я не понимаю, как глубокая копия может произойти. В вышеприведенной программе не происходит даже мелкой копии. Мне нужно, чтобы он работал, даже если класс Base является абстрактным классом. Как я могу сделать глубокую копию здесь? Помоги пожалуйста?
Clone() - это не то, что вы видите (часто) на C++. Вы переносите приложение Java? –
Нет. Я пытаюсь сделать глубокую копию на C++, и некоторые программисты на C++ создали собственную функцию clone(), как показано выше. Будет более понятно, когда вы будете следовать ссылкам, показанным в разделе «Мой вопрос связан с этим, этим и этим сообщением». (предложение в кавычках показано в моем вопросе выше) – Nav