2011-02-02 72 views
1

我有一个抽象基类来执行一些子类来重载运算符。复制抽象基类的子类

我在std :: stack中存储了一堆指向这些子类的实例的指针......在某些时候,我希望复制堆栈的顶层项目(并将其推到顶部)。

问题是,我无法实例化一个抽象类。很明显,因为我想为我的每个子类做这件事,所以我不知道类型...

我不知道这是甚至可能没有添加另一个纯粹的虚拟方法(说'Base * clone()= 0')并在我的每个子类中实现它?当然必须有一个更清洁的方式。

回答

4

我想你在这种情况下实际上需要一个Clone方法。您希望在运行时动态复制子类项目,并且在运行时更改行为的常规方法是虚拟方法。如果不使用某种虚拟方法,您将无法确定它是哪个孩子。你也许可以使用CRTP自动生成克隆你,但:

// Totally uncompiled and untested. 
class Base 
{ 
public: 
    virtual Base* Clone() const = 0; 
}; 

template <class T> 
class Child : public Base 
{ 
public: 
    virtual Base* Clone() const { return new T(*static_cast<T*>(this)); } 
protected: 
    Child(); // Can't instantiate directly 
    Child(const Child& right); // Can't instantiate directly 
}; 

class Grandchild : public Child<Grandchild> 
{ 
    // Clone should do the right thing. 
}; 
+0

完美!非常感谢。 – 2011-02-02 05:59:17

0

你的意思是使类的副本,而不是复制指针。

您将需要实现自己的输入。换句话说有一个虚函数返回类的类型,然后创建合适的类

或者启用RTTI(运行时类型信息)来做同样的事情。因为RTTI对每个类都有影响,因此可以更有效地创建自己的类型方法。

然后你就可以

  1. 流行指针
  2. 获取型
  3. 实例化一个 开关使用 一个拷贝构造函数可能是正确的类
  4. 推两回压入堆栈

psuedocode

base* ptr = stack.pop() 
base *copy 
switch (ptr->typeof()) { 
    case class1type : copy = new class1(ptr) break; 
    case class2type : copy = new class2(ptr) break; 
    ... 
} 

stack.push (ptr) 
stack.push(copy) 

DC