链表的C++继承

C++ inheritance of linked list

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

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

当我使用NewLinkedList时,它的next仍然是指向LinkedList的指针而不是NewLinkedList,所以我无法访问newlinkedlist.next->data2没有类型演员表。 (newlinkedlistNewLinkedList 的对象。)

我如何设计这两个 class 来避免这个问题?

有没有类似SELF_TYPE *next;的东西,当它被继承时,它会自动成为class本身的派生类型?

您可以使用模板:

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

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

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

为了改进设计,您的 LinkedList class 不应包含链表机制所需数据以外的任何数据:它应该只是基础 class。然后你像上面那样用专门的 classes.

子class

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

假设您希望实现的目标是可能的。

考虑:

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

nextAveryNewLinkedList 还是 NewLinkedList 类型?

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

所以继承意味着你从你的 parents 中获取位并添加到它们中 - 但 parents 不会从你那里得到任何东西!