复制抽象基类的子类

时间:2011-02-02 04:59:43

标签: c++ abstract-class subclass duplication

我有一个抽象的基类来强制执行一些子类来重载<<操作

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

问题是,我无法实例化一个抽象类。显然,既然我想为每个子类做这个,我就不会知道类型......

我想知道如果不添加另一个纯虚方法(比如'Base * clone()= 0')并且在我的每个子类中实现它,这是否可行?当然必须有一个更清洁的方式。

2 个答案:

答案 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.
};

答案 1 :(得分:0)

您的意思是复制该类,而不是复制指针。

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

或启用RTTI(运行时类型信息)来执行相同的操作。因为RTTI影响每个类,它可能更有效地创建自己的typeof方法。

然后你可以

  1. 弹出指针
  2. 获取类型
  3. 使用实例化正确的类 复制构造函数可能在一个 开关
  4. 将两者推回堆栈
  5. 伪码

     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