c++ - 如何在纯抽象类中实现克隆?

标签 c++ abstract derived-class

所以我想在我的派生类中覆盖纯抽象方法,但我得到了这个错误。谁能帮我看看发生了什么,我该如何完成。

我的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/

相关文章:

c++ - 如何停止关闭QT Widget?

c# - 如何从XML反序列化抽象类的具体实现

scala - 抽象父类(super class) scala 中的断言创建 NPE

c++ - 基类和派生类中的构造函数

c++ - 如何通过创建类型特征来对 NTTP 类进行分类?

c++ - 通过Qt widget打开它时是否可能有一个文件 'pop-up'?

C++ libtins 构建错误

c++ - 具有继承类和函数的抽象类写入单独的 vector c++

c++ - 指向类族中各种类型的指针的限制?

java - 禁用派生类上的继承方法