1

我有一个抽象基类来强制一些子类重载 << 运算符。

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

问题是,我无法实例化抽象类。显然,因为我想为我的每个子类都这样做,所以我不知道类型......

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

4

2 回答 2

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.
};
于 2011-02-02T05:25:35.853 回答
0

您的意思是制作类的副本,而不是复制指针。

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

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

那么你就可以

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

伪代码

 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)

直流

于 2011-02-02T05:28:42.860 回答