我有一个抽象基类来强制一些子类重载 << 运算符。
我将一堆指向这些子类实例的指针存储在 std::stack 中......有时我希望复制堆栈的顶部项目(并将其推到顶部)。
问题是,我无法实例化抽象类。显然,因为我想为我的每个子类都这样做,所以我不知道类型......
我想知道如果不添加另一个纯虚拟方法(比如'Base *clone() = 0')并在我的每个子类中实现它,这是否可能?当然必须有更清洁的方法。
我有一个抽象基类来强制一些子类重载 << 运算符。
我将一堆指向这些子类实例的指针存储在 std::stack 中......有时我希望复制堆栈的顶部项目(并将其推到顶部)。
问题是,我无法实例化抽象类。显然,因为我想为我的每个子类都这样做,所以我不知道类型......
我想知道如果不添加另一个纯虚拟方法(比如'Base *clone() = 0')并在我的每个子类中实现它,这是否可能?当然必须有更清洁的方法。
我认为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.
};
您的意思是制作类的副本,而不是复制指针。
您将需要实现自己的类型。换句话说,有一个返回类类型的虚函数,然后创建适当的类
或者启用 RTTI(运行时类型信息)来做同样的事情。因为 RTTI 会影响每个类,因此创建自己的 typeof 方法可能更有效。
那么你就可以
伪代码
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)
直流