我有一个类型为Device的链接列表:
Node<Device> list = new Node<device>(device);
并且Device有派生类:
我需要我的列表能够保存每个派生类的设备。
我该怎么做?
注意:如果我将Aerobic_Device发送到列表,它只会动态转换为设备,这会丢失数据。
修改
我改变了程序的所有逻辑以使用指针,现在列表是:Node<Device*>
- 它仍将所有内容转换为设备类型。
现在,正如许多人所建议的那样,我将其切换为Node<std::unique_ptr<Device>>
,但这只引入了许多错误。
答案 0 :(得分:2)
您无法按值存储对象,并且同时具有多态行为。您可以通过(最好是智能)指针存储您的对象:
Node<std::unique_ptr<Device>> list;
答案 1 :(得分:1)
使列表为Device*
类型(注意指针)。
Node<Device*> list;
然后,声明派生类型的对象(PowerDevice
,AerobicDevice
,PowerAerobicDevice
)并将它们放在列表中。
通过这种方式,您可以利用运行时多态性的强大功能。
或者,您可以(并且应该)使用智能指针而不是原始指针来自动处理内存:
std::unique_ptr<Device> pDevice= std::make_unique<PowerDevice>(...);
// put into list
std::unique_ptr<Device> aDevice= std::make_unique<AerobicDevice>(...);
// put into list
std::unique_ptr<Device> paDevice= std::make_unique<PowerAerobicDevice>(...);
// put into list