class LinkedList{
public:
int data;
LinkedList *next;
};
class NewLinkedList: public LinkedList{
public:
int data2;
};
当我使用NewLinkedList
时,其next
仍然是指向LinkedList
而非NewLinkedList
的指针,因此我无法在没有类型转换的情况下访问newlinkedlist.next->data2
。 (newlinkedlist
是NewLinkedList
的对象。)
如何设计这两个类以避免此问题?
是否有类似SELF_TYPE *next;
的东西,它在继承时会自动成为派生类本身的类型?
答案 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
?
编译器不知道 - 你也不知道。
所以继承意味着你从父母那里得到一些东西并添加到他们身上 - 但是父母没有从你那里得到任何东西!