我觉得Java比C ++更流利,所以我会用几句话来解释我想要“传输”的内容。在Java
中,您可以创建一个包含2个或更多类的对象的ArrayList
,其中一个类继承自另一个类。让我来说明一下。假设我们有:
class Vehicle
{
...
}
class Car extends Vehicle
{
...
}
然后您可以执行类似Car a = new Vehicle ([arguments]);
的操作
然后,您可以将Vehicle
和Car
的对象添加到创建的同一ArrayList
中:
ArrayList ar = new ArrayList<Car>();
现在我的问题是,在C ++中我手动编写代码来创建一个简单的链表。该列表的每个节点如下所述:
struct clientListNode
{
vip* cust;
struct clientListNode* next;
};
vip
是另一个派生自customer
的类。有没有办法让我的列表接受vip
类和customer
类的对象?
答案 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_ptr
(std::list<std::shared_ptr<cust>>
)类似,创建的对象将自动销毁。
答案 1 :(得分:3)
我怀疑你甚至可以在java中制作Car = new Vehicle,但另一种方式是有道理的。
你所追求的是“多态集合”。 C ++标准库没有开箱即用的,但您可以使用shared_ptr<Vehicle>
或unique_ptr<Vehicle>
的集合来近似它。前者会非常接近java等价物。
第三方图书馆可能已准备好使用多态集合,您可以使用该术语进行搜索。
答案 2 :(得分:1)
如果customer
是基类,则节点的cust
字段应为customer*
类型,并且很乐意接受客户和贵宾。