2016-11-12 4 views
3
class LinkedList{ 
    public: 
    int data; 
    LinkedList *next; 
}; 

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

Когда я использую NewLinkedList, его next еще указатель на LinkedList вместо NewLinkedList, так что я не могу получить доступ к newlinkedlist.next->data2 без приведения типов. (newlinkedlist является объектом NewLinkedList.)C++ из связанного списка

Как я могу создать эти два класса, чтобы избежать этой проблемы?

Есть ли что-то вроде SELF_TYPE *next;, и он автоматически становится типом производного класса, когда он наследуется?

+0

Как ваш вопрос о виртуальном наследовании? – curiousguy

ответ

3

Вы можете использовать шаблон:

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

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

Этот метод известен как Любопытно повторяющегося рисунка шаблона (CRTP)

Чтобы улучшить дизайн, ваш LinkedList класс не должен содержать никаких других данных чем то, что необходимо для механизма связанного списка: он должен быть только базовым классом. Затем вы подклассифицируете его, как указано выше, со специализированными классами.

+0

Тогда как я могу использовать базовый класс 'LinkedList'? – zzh1996

+0

Я думаю, что не нужно использовать LinkedList напрямую, только через подклассы, будет лучшим дизайном. LinkedList не будет хранить данные (удалить элемент данных) и будет являться шаблоном с чистым связующим списком. – galinette

0

Я предлагаю сделать родительский класс абстрактным и сделать элементы данных частными (в большинстве случаев это должно быть сделано, если у вас нет действительно повод, чтобы этого не делать) и добавить абстрактные функции для доступа этих членов. Это будет хороший дизайн и решит вашу проблему.

+0

Я должен использовать приведение типов при реализации абстрактной функции в производном классе. например 'return (Derived *) Base :: get_next();' – zzh1996

-1

Предположим, что вы хотите достичь.

Рассмотрим:

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

Будет next быть типа AveryNewLinkedList или NewLinkedList?

Компилятор не знает - и не делает.

Таким образом, наследование означает, что вы получаете бит от своих родителей и добавляете к ним - но родители ничего не получают от вас!

Смежные вопросы