Я очень новичок в C++, и я не совсем уверен, как переопределить методы из базового класса. Приносим извинения за не перевод кода на английский язык до публикации, но я не думаю, что это имело бы значение.Наследование метода от абстрактного класса
Резюме того, что я хотел бы сделать, это создать абстрактный базовый класс для связанных списков, а затем получить поодиночке/двукратно/умножения связаны/круговые листы из него и т.д.
Вот код:
#ifndef __LISTA_H__
#define __LISTA_H__
class Elem;
class JulElem;
class Lista // Abstract list class
{
public:
Lista();
~Lista();
virtual void dohvatiGlavu() = 0;
virtual void dodajNaKraj(int vred) = 0;
virtual void dodajIza(Elem* elem, int vr) = 0;
virtual void obrisiIza(Elem* elem) = 0;
virtual bool prazna() = 0;
virtual int velicina() = 0;
protected:
class Elem
{
protected:
int vred;
};
virtual Elem* noviElem();
private:
Elem* glava;
};
class Jul : Lista // Singly linked list
{
public:
void dohvatiGlavu();
void dodajNaKraj(int vred);
void dodajIza(Elem* elem, int vr);
void obrisiIza(Elem* elem);
bool prazna();
int velicina();
private:
class JulElem : Elem
{
};
JulElem* noviElem();
};
Это ошибка, я получаю:
error C2555: 'Jul::noviElem': overriding virtual function return type differs and is not covariant from 'Lista::noviElem'
Я видел, как люди в основном используют для структур элементов списка, но я не уверен, как это будет соответствовать мой вариант развития событий, так как различные типы списки требуют разных типов структур.
Благодаря
Вы не должны изменять возвращаемый тип функции при переопределении (за исключением тех типов _covariant_, но вам это действительно не нужно). Измените 'JulElem * noviElem();' на 'Elem * noviElem();'. – rodrigo
В этом случае части JulElem были бы обрезаны, что означает, что я получу указатель на Elem вместо JulElem? – blashyrk
@blashyrk: Нет, этот вид * нарезки * происходит только тогда, когда вы возвращаете значение, а не указатель. Но вы не сможете получить доступ к каким-либо членам 'JulElem', если у вас есть указатель на« Elem », поэтому вы, вероятно, захотите вернуть« JulElem * »здесь; вам просто нужно исправить частное наследование, чтобы типы были ковариантными. –