您能否从抽象引用创建具体对象的副本

Can you create a copy of a concrete object from an abstract reference

本文关键字:对象 副本 创建 引用 抽象      更新时间:2023-10-16

我有一组类:Value,ReportItem,ReportMessage。 Value 类是抽象的,具有许多不同的具体实现(例如 IntValue、FloatValue、DoubleValue 等(。 创建报表项时,通过传递对值的引用,将具体类添加到报表项中:

ReportItem(Value& value);

然后使用"addItem"方法向ReportItems添加一个ReportMessage,该方法获取报告项的副本并将其删除:

class ReportMessage {
    ...
    void addItem(ReportItem item);
}

因此,代码片段可能如下所示:

IntValue value(1);
ReportItem item(value);
ReportMessage message;
message.addItem(item);

我在创建 ReportItem 的副本时没有问题,但我对值有问题,因为它是一个抽象类。 创建报表项时,它将采用对 Value 对象的引用,并保留该引用,直到删除报表项。这是个问题,因为如果在 ReportItem 完成之前删除 Value 对象,地球将脱离其轴并螺旋进入太阳。

有没有解决这个问题的好方法?我想要的是一种引用 Value 对象 (Value&( 并以某种方式创建具体对象的副本的方法,然后由报表项保留该副本。 这可能吗,或者有更好的方法。

谢谢。

注意:我没有使用 C++11。

作为一个简化的示例,下面介绍如何使ReportItem类拥有该值。您需要在复制和赋值语义("虚拟复制构造函数"等(上努力工作,但我将其留给您解决(即在此站点上搜索现有答案(:

class ReportItem
{
    Value * vptr;    // vptr is the first thing in the class
public:
    ReportItem(int n) : vptr(new IntValue(n)) { }
    ReportItem(float x) : vptr(new FloatValue(x)) { }
    ~ReportItem() { delete vptr; }
    // write difficult copy and assignment logic!
};

没有 C++11 会使这比它需要的更麻烦,因为您没有合理的移动语义,并且可能需要制作大量不必要的副本。

(在 C++11 中,你只有一个 std::unique_ptr<Value> 成员,没有显式析构函数,你可以说message.addItem(ReportItem(1.5));