有没有办法通过指向base的指针复制派生类对象?

时间:2015-01-14 19:02:43

标签: c++ inheritance copy-constructor derived-class base-class

有没有办法通过指向base的指针复制派生类对象? 或者如何创建这样的拷贝构造函数?

例如:

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 [0]是Derived1对象而* B [1]是Derived2对象? 如果没有,我怎么能通过指向基类的指针复制派生类?是否有通过基类或派生类构建复制构造函数的特定方法?对于示例,默认的复制构造函数是否足够好?

2 个答案:

答案 0 :(得分:5)

您可以为此提供虚拟方法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;
};

答案 1 :(得分:0)

main的第二行(除了拼写错误)之外,你构造了类Base的两个实例,然后你会问最后两行中某些对象是否会在变形上变形飞行并成为派生类的实例。这当然是不可能的。

另外,请检查此answer

注意:我只是评论您提供的代码和用例。使用虚拟Clone函数是复制多态对象的正确设计。