包含C ++中两个不同类的对象的列表

时间:2013-06-11 19:38:59

标签: c++ list object

我觉得Java比C ++更流利,所以我会用几句话来解释我想要“传输”的内容。在Java中,您可以创建一个包含2个或更多类的对象的ArrayList,其中一个类继承自另一个类。让我来说明一下。假设我们有:

class Vehicle
{
...
}

class Car extends Vehicle
{
...
}

然后您可以执行类似Car a = new Vehicle ([arguments]);的操作 然后,您可以将VehicleCar的对象添加到创建的同一ArrayList中:

ArrayList ar = new ArrayList<Car>();

现在我的问题是,在C ++中我手动编写代码来创建一个简单的链表。该列表的每个节点如下所述:

struct clientListNode
{
    vip* cust;
    struct clientListNode* next;
};

vip是另一个派生自customer的类。有没有办法让我的列表接受vip类和customer类的对象?

3 个答案:

答案 0 :(得分:5)

多态性以另一种方式起作用。您可以使用customer*指针指向vip对象,但不能指向其他方式。 (这与Liskov-substitution principle有关。)

因此,如果您的customer*课程中有clientListNode,则会接受vip*customer*指针。

但是,我认为你不应该重新发明轮子并从地面实施链表。您应该查看 STL (标准模板库),它已经为此类问题提供了解决方案。例如,它已经有了链表std::list

的实现

您必须使用您想要使用的基本类型来模板std::list,但重要的是您不能将该类型直接用作值(std::list<cust>),因为这样做将cust实例存储在内存中,您无法使用更具体的vip类型(切片会发生)。
相反,您必须使用某种句柄作为模板参数,您可以使用本机指针(std::list<cust*>),但这样您必须管理内存释放,或者 - 更优选 - 您可以使用智能指针,与shared_ptrstd::list<std::shared_ptr<cust>>)类似,创建的对象将自动销毁。

答案 1 :(得分:3)

我怀疑你甚至可以在java中制作Car = new Vehicle,但另一种方式是有道理的。

你所追求的是“多态集合”。 C ++标准库没有开箱即用的,但您可以使用shared_ptr<Vehicle>unique_ptr<Vehicle>的集合来近似它。前者会非常接近java等价物。

第三方图书馆可能已准备好使用多态集合,您可以使用该术语进行搜索。

答案 2 :(得分:1)

如果customer是基类,则节点的cust字段应为customer*类型,并且很乐意接受客户和贵宾。