C ++继承链表

时间:2016-11-12 14:25:40

标签: c++ oop inheritance linked-list virtual-inheritance

class LinkedList{
    public:
    int data;
    LinkedList *next;
};

class NewLinkedList: public LinkedList{
    public:
    int data2;
};

当我使用NewLinkedList时,其next仍然是指向LinkedList而非NewLinkedList的指针,因此我无法在没有类型转换的情况下访问newlinkedlist.next->data2。 (newlinkedlistNewLinkedList的对象。)

如何设计这两个类以避免此问题?

是否有类似SELF_TYPE *next;的东西,它在继承时会自动成为派生类本身的类型?

3 个答案:

答案 0 :(得分:3)

您可以使用模板:

template <typename T>
class LinkedList{
public:
    int data;
    T * next;
};

class NewLinkedList: public LinkedList<NewLinkedList>{
public:
    int data2;
};

这种技术被称为奇怪的重复模板模式(CRTP)

为了改进设计,您的LinkedList类不应包含除链表机制所需的数据之外的任何数据:它应该只是一个基类。然后使用专门的类将它子类化为上一步。

答案 1 :(得分:0)

我建议,将父类设为抽象,并使数据成员为私有(在大多数情况下,应该完成;除非你有一些非常好的理由不这样做)并添加抽象函数来访问这些成员。这将是一个很好的设计,也可以解决你的问题。

答案 2 :(得分:-1)

让我们假设您希望实现的目标。

考虑:

class AveryNewLinkedList: public LinkedList{
    public:
    int data2;
};

next类型是AveryNewLinkedList还是NewLinkedList

编译器不知道 - 你也不知道。

所以继承意味着你从父母那里得到一些东西并添加到他们身上 - 但是父母没有从你那里得到任何东西!