有没有办法通过指向基类的指针来复制派生类对象?或者如何创建这样的复制构造函数?
例如:
class Base {
public: Base( int x ) : x( x ) {}
private: int x;
};
class Derived1 : public Base {
public:
Derived( int z, float f ) : Base( z ), f( f ) {}
private:
float f;
};
class Derived2 : public Base {
public:
Derived( int z, string f ) : Base( z ), f( f ) {}
private:
string f;
};
void main()
{
Base * A = new *Base[2];
Base * B = new *Base[2];
A[0] = new Derived1(5,7);
A[1] = new Derived2(5,"Hello");
B[0] = Base(*A[0]);
B[1] = Base(*A[1]);
}
问题是*B是不是Derived1对象,*B1是Derived2对象?如果没有,我如何通过指向基类的指针来复制派生类?是否有通过基类或派生类构建复制构造函数的特定方法?对于这个例子,默认的复制构造函数足够好吗?
发布于 2015-01-14 19:05:41
您可以为此提供虚拟方法Clone
:
class Base {
public:
Base(int x) : x(x) {}
virtual ~Base() {}
virtual Base* Clone() const { return new Base(*this); }
private:
int x;
};
class Derived1 : public Base {
public:
Derived1(int z, float f) : Base(z), f(f) {}
virtual Derived1* Clone() const { return new Derived1(*this); }
private:
float f;
};
class Derived2 : public Base {
public:
Derived2(int z, std::string f) : Base(z), f(f) {}
virtual Derived2* Clone() const { return new Derived2(*this); }
private:
std::string f;
};
发布于 2015-01-14 19:27:45
在main
的第二行(除了拼写错误之外),您构造了类Base
的两个实例,然后您会问,在最后两行中,这些对象是否会以某种方式动态变形并成为派生类的实例。这当然是不可能的。
另外,检查这个answer。
注释:我只是对您提供的代码和用例进行评论。使用虚拟Clone
函数是复制多态对象的正确设计。
https://stackoverflow.com/questions/27950526
复制