从指针复制派生对象



假设我有一个类a和B,其中B从a派生。后来我有了一个指针a*,它可以指向对象类a或对象类B。现在我想在指针下复制这个对象,而不知道这个指针指向的是哪个对象,所以如果有a对象,我想复制a对象,但如果是B,我想拷贝B。我想省略RTTI和动态铸造。你知道怎么做吗?或者我必须实现类似虚拟克隆函数的东西并显式调用它吗?

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

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
};

在成员复制的简单情况下,它似乎是向前的:

#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;
}

最新更新