【问题标题】:C++ inheritance of linked list链表的C++继承
【发布时间】:2017-03-26 14:49:27
【问题描述】:
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;之类的东西在继承的时候自动变成派生类本身的类型吗?

【问题讨论】:

  • 您对虚拟继承有何疑问?

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


【解决方案1】:

您可以使用模板:

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

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

这种技术被称为Curiously recurring template pattern (CRTP)

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

【讨论】:

  • 那我该如何使用LinkedList基类呢?
  • 我认为不必直接使用 LinkedList,只通过子类,会是更好的设计。 LinkedList 不会存储任何数据(删除数据成员),并且将是一个纯链表模板。
【解决方案2】:

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

【讨论】:

  • 我必须在派生类的抽象函数的实现中使用类型转换。例如return (Derived*)Base::get_next();
【解决方案3】:

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

考虑:

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

nextAveryNewLinkedList 还是 NewLinkedList 类型?

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-03-05
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 2015-04-19
    • 2016-12-25
    • 2019-04-13
    • 2021-12-07
    相关资源
    最近更新 更多