C ++ - 有一种类型可以容纳它的孩子

时间:2015-12-28 08:53:46

标签: c++ linked-list polymorphism derived-class

我有一个类型为Device的链接列表:

Node<Device> list = new Node<device>(device);

并且Device有派生类:

enter image description here

我需要我的列表能够保存每个派生类的设备。

我该怎么做?

注意:如果我将Aerobic_Device发送到列表,它只会动态转换为设备,这会丢失数据。

修改

我改变了程序的所有逻辑以使用指针,现在列表是:Node<Device*> - 它仍将所有内容转换为设备类型。 现在,正如许多人所建议的那样,我将其切换为Node<std::unique_ptr<Device>>,但这只引入了许多错误。

2 个答案:

答案 0 :(得分:2)

您无法按值存储对象,并且同时具有多态行为。您可以通过(最好是智能)指针存储您的对象:

Node<std::unique_ptr<Device>> list;

答案 1 :(得分:1)

使列表为Device*类型(注意指针)。

Node<Device*> list;

然后,声明派生类型的对象(PowerDeviceAerobicDevicePowerAerobicDevice)并将它们放在列表中。

通过这种方式,您可以利用运行时多态性的强大功能。

或者,您可以(并且应该)使用智能指针而不是原始指针来自动处理内存:

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