所以我想在我的派生类中覆盖纯抽象方法,但我得到了这个错误。谁能帮我看看发生了什么,我该如何完成。
我的Device
类;
class Device {
public:
Device();
Device(const Device& orig);
virtual ~Device();
virtual Device Clone() = 0;
}
还有我的派生类;
class Radar : public Device {
public:
Radar();
// Radar(const Radar& orig); // commenting so the compiler using its default copy constructor
virtual ~Radar();
Radar Clone();
};
我的 Radar
类的源文件;
Radar Radar::Clone() {
return *(new Radar(*this));
}
如果我在 Device
类的 Clone
方法中使用 Device
类型,它将弹出那个 Device
是一个抽象类。
如果我使用 void
类型(我假设它不是我想要的),它会显示我没有实现这个方法。
我该怎么办?
最佳答案
您的 Clone
方法将需要返回指向克隆对象的指针...协变返回类型只能以这种方式工作(因为按值返回要求调用者将返回值复制到堆栈 -当您使用 new
分配它时,这将是内存泄漏。
所以,应该是:
virtual Device* Clone() = 0;
...以及以后...
Radar* Clone(); // YES, it should be Radar* here - that uses C++'s support for
// "covariant return types", see also "UPDATE" discussion
Radar* Radar::Clone()
{
return new Radar(*this);
}
更新 - 根据要求进一步解释
因此,克隆函数的想法是它可以返回您的 Device*
当前正在寻址的任何实际派生类型的深层拷贝。鉴于派生类型可能会添加 Device
缺少的数据成员,它可能是一个更大的对象,并且调用者无法保留适当数量的堆栈空间来存储它。因此,需要使用 new
动态分配对象,并且可预测大小的 Device*
是调用者访问新对象的方式。 clone 函数返回 Radar*
是合法的 - 这意味着客户端代码在编译时知道它正在处理 Radar
并克隆它可以继续将其用作 Radar
- 访问 Radar
提供的任何额外成员。
希望这有助于澄清事情。您可能还想阅读一些有关面向对象编程的背景知识。
关于c++ - 如何在纯抽象类中实现克隆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26479953/