假设我有一个类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;
}