2

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

4

2 回答 2

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
};
于 2013-08-21T17:05:50.290 回答
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;
}
于 2013-08-21T17:56:37.913 回答