2

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

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类的对象?

4

3 回答 3

5

多态性以另一种方式工作。您可以使用customer*指针指向vip对象,但不能相反。(这与里氏替换原则有关。)

因此,如果您customer*clientListNode班级中有 a ,它将同时接受vip*customer*指针。

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

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

于 2013-06-11T20:07:41.977 回答
3

我怀疑即使在 java 中你也可以使 Car = new Vehicle ,但反过来说也有意义。

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

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

于 2013-06-11T19:49:13.617 回答
1

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

于 2013-06-11T19:45:28.637 回答