从指针创建派生对象副本

时间:2013-08-21 16:58:09

标签: c++

假设我有一个A和B类,其中B派生自A.后来我有一个指针A *,它可以指向一个对象类A或对象类B.现在我想在指针下复制这个对象不知道这个指针指向哪个对象,所以如果有一个A对象,那么我想复制一个A对象,但如果它是B,那么我想复制B.我想省略RTTI和动态转换。你知道怎么做吗?或者我必须实现虚拟克隆功能之类的东西并明确地调用它吗?

2 个答案:

答案 0 :(得分:4)

克隆虚函数是最典型的方法,例如

class Base {
    public: virtual Base* clone() { return new Base(*this); }
};

class Derived : public Base {
    public: virtual Base* clone() { return new Derived(*this); }
};

但是,有时候,当你有一个指向Derived的指针并且你克隆它时,你突然有一个指向Base的指针,而你知道派生的。如果您想访问Derived特定成员,则需要进行向下转换。

根据C ++ 98标准,您实际上可以将返回类型更改为派生类型,例如

class Base {
    public: virtual Base* clone() { return new Base(*this); }
};

class Derived : Base {
    public: virtual Derived* clone() { return new Derived(*this); } //will overload Base::clone
};

答案 1 :(得分:0)

在成员复制的简单情况下,它似乎很明显:

#include<iostream>
using namespace std;

class A{
public:
    ~A(){}
    A() : _x('A') {}
    void foo() { cout << _x << endl; }   
protected:
    char _x;    
};

class B : public A{
public:
    ~B(){}
    B() { _x = 'B';}
};

int main()
{
    A* a = new A();
    A* b = new B();

    A* c(a);
    c->foo();  //A

    A* d(b);
    d->foo();   //B

    delete a,b;
}