我的班以下关系。 我想克隆派生的类,但我得到的错误“无法实例化抽象类”。 我怎样才能克隆派生类? 谢谢。
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);
}
};
只有具体的类可以被实例化。 你不得不重新设计的派生的接口,以便做克隆。 首先,除去虚拟无效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);
}
};
无法实例其中有这样一个纯虚函数的类:
virtual void yourFunction() = 0
做一个子类,或者将其删除。
只有具体的类可以instancied。 FUNC应不纯粹。
我可以在这里说一些愚蠢的事,但我认为,在派生类的clone方法应的指针还是回到基类。 也许它仍然编译罚款,但至于代码的可维护性来讲,我觉得是更好地只使用方法克隆的指针返回基类。 毕竟,如果你的派生类具有克隆成一个指向派生类,你可以也只是做
Derived original;
Derived* copy = new Derived(original)
当然,你需要实现的拷贝构造函数,但通常应该反正实现(除极端情况下)。