链表的C++继承

标签 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;这样的东西在被继承的时候自动变成派生类本身的类型?

最佳答案

您可以使用模板:

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

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

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

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

关于链表的C++继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40563796/

相关文章:

c++ - CUDA 内存(类型),用于内核调用期间的仅设备计算(计算 1.1 或 1.2)

c++ - 为什么 `std::string::find()` 在失败时不返回结束迭代器?

javascript - node js中的面向对象编程

c++ - 有没有办法指定或断言子类必须重新实现特定的非抽象虚方法?

java - 来自抽象父类(super class)的抽象方法作为子类中的静态方法

java - 在Java中,如何让子类决定使用哪种类型参数类作为重写方法参数?

c++ - 以下程序中创建的用于 map 初始化的临时变量在哪里

c++ - 错误 LNK2019 : unresolved external symbol "public: __thiscall Signal

javascript - 从 C# 到 JavaScript - 使用类实例

javascript - 设置间隔() : How to stop then start itself again?