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