2013-06-11 59 views
2

我觉得Java比C++更流利,所以我将尝试用几句话来解释我想“传输”的内容。在Java中,您可以创建一个ArrayList,其中包含两个或更多类的对象,其中一个类从另一个类继承。让我说明一下。比方说,我们有:包含C++中两个不同类的对象的列表

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什么办法可以让我的名单接受vip类和customer类的两个对象是从customer。就是有派生另一个类?

回答

5

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

所以,如果你在你的clientListNode类有一个customer*,将同时接受vip*customer*指针。

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

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

+0

感谢您的评论,但事实上我必须重新发明轮子,这是我的一个项目。这是为了建设性的反馈,并回答我的问题。 –

1

如果customer是基类,那么该节点的cust字段应该是customer*类型,并且它会很乐意接受客户和vip。

3

我怀疑你可以让Car = new Vehicle甚至在java中,但反过来说也是有道理的。

你在追求什么被称为“多态收集”。 C++标准库没有一个开箱即用,但您可以用shared_ptr<Vehicle> s或unique_ptr<Vehicle> s的集合来近似它。前者可以非常接近java的等价物。

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

相关问题