我看到过一些解决方案(包括在这个网站上)来解决在一个类中实现clone
方法的问题,以便它返回一个堆分配的自身克隆,即使我们只有Base
类。
问题在于当你不得不在许多类中再次实现相同的方法时,会出现问题。我记得有一种方式可以做到这一点,那就是继承一个模板类(命名为Cloneable
)使其实现它,但我尝试的方法行不通:
template<typename T, typename B> class Cloneable{
public:
B* clone(){return new T(*this);}
};
class Bottom {
public:
virtual void sayhi() = 0;
virtual Bottom* clone() = 0;
};
class Middle: public Cloneable<Middle, Bottom>, public Bottom {
public:
void sayhi() override {cout << "Hi from the Middle" << endl;}
};
//class Top: public Middle ...?
int main() {
Bottom* b1 = new Middle();
b1->sayhi();
delete b1;
}
我记得向我展示这个的人实际上只使用了 Cloneable
中的一个参数,但无论如何,我都会感谢您能想象出的任何方式来完成这个。
Middle
,但它还没有被定义。任何继承自抽象类的东西都应该重写抽象类中的函数,否则子类也将是抽象的。 - IcanCodeCloneable
的角度来看,*this
是Cloneable&
,因此new T(*this)
期望一个构造函数,该构造函数需要一个Cloneable&
,而不是Middle&
或其他任何类型。其次,在Cloneable
中具有clone
并不意味着实现了Bottom
中的虚拟clone
。在像Java这样的语言中,您可以这样做,但在C ++中不可能。 - Holtnew
什么类型。 - Caleth