我有一个抽象的基类来强制执行一些子类来重载<<操作
我在std :: stack中存储了一堆指向这些子类实例的指针...在某些时候我希望复制堆栈的顶部项目(并将其推到顶部)。
问题是,我无法实例化一个抽象类。显然,既然我想为每个子类做这个,我就不会知道类型......
我想知道如果不添加另一个纯虚方法(比如'Base * clone()= 0')并且在我的每个子类中实现它,这是否可行?当然必须有一个更清洁的方式。
答案 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方法。
然后你可以
伪码
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