我有以下类的关系。我想克隆类Derived,但我得到错误“无法实例化抽象类”。我如何克隆派生类?感谢。
class Base {
public:
virtual ~Base() {}
virtual Base* clone() const = 0;
};
class Derived: public Base {
public:
virtual void func() = 0;
virtual Derived* clone() const {
return new Derived(*this);
}
};
答案 0 :(得分:7)
只能实例化具体的类。您必须重新设计Derived的接口才能进行克隆。首先,删除 virtual void func()= 0; 然后你就可以编写这段代码了:
class Base {
public:
virtual ~Base() {}
virtual Base* clone() const = 0;
};
class Derived: public Base {
public:
virtual Derived* clone() const {
return new Derived(*this);
}
};
另一个解决方案是将纯虚函数保留在原位并添加一个具体的类:
class Base {
public:
virtual ~Base() {}
virtual Base* clone() const = 0;
};
class Derived: public Base {
public:
virtual void func() = 0;
};
class Derived2: public Derived {
public:
virtual void func() {};
virtual Derived2* clone() const {
return new Derived2(*this);
}
};
答案 1 :(得分:4)
您无法实例化具有纯虚函数的类:
virtual void yourFunction() = 0
创建一个子类或删除它。
答案 2 :(得分:2)
只能实习具体课程。 Func应该不纯粹。
答案 3 :(得分:0)
我可能在这里说一些愚蠢的东西,但我认为派生类中的clone方法仍应返回指向基类的指针。也许它仍然编译得很好,但就代码的可维护性而言,我认为最好只使用方法clone来返回指向基类的指针。毕竟,如果你的派生类必须克隆到指向派生类的指针,你也可以这样做
Derived original;
Derived* copy = new Derived(original)
当然,您需要实现复制构造函数,但通常应该实现(除极端情况外)。