创建不适用于虚拟基类的对象的克隆
#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说
“由于克隆方法是对象实际类的一种方法,因此它也可以创建一个深层副本,它可以访问它所属的类的所有成员,所以没有问题。”
我不明白如何发生深层复制。 在上面的程序中,甚至没有发生浅拷贝。 即使Base类是抽象类,我也需要它 。 我怎样才能在这里做一个深层复制? 请帮助?
那么,你的拷贝构造函数什么都不做,所以你的clone方法在拷贝的时候什么也不做。
查看Derived(const Derived&) {}
行Derived(const Derived&) {}
编辑:如果添加代码通过赋值复制派生的所有成员,它将成为一个浅拷贝。 如果您还复制(通过创建一个新实例)您的实例,它将成为一个深层复制。
链接地址: http://www.djcxy.com/p/79367.html上一篇: Creating clone of an object not working with virtual base class
下一篇: Made one instance of a class equal to another. – How to cancel that?