Как объявить абстрактный итератор?
Пишу итератор для хэш-таблицы. Таблица может быть двух видов, поэтому использую полиморфизм. Нужно объявить итератор, но возникает ошибка:
C2555 CCHash<T,K>::begin: возвращаемый тип перегруженной виртуальной функции отличается от "AbstractHash<T,K>::begin" и не является ковариантным
И точно такая же для AbstractHash<T,K>::end.
AbstractHash:
class AbstractHash
{
public:
class iterator {
public:
virtual const iterator& operator=(const iterator&) = 0;
virtual T& operator*() = 0;
virtual const iterator& operator++() = 0;
virtual const iterator operator++(int) = 0;
virtual const iterator& operator--() = 0;
virtual const iterator operator--(int) = 0;
virtual const bool operator==(const iterator&) = 0;
virtual const bool operator!=(const iterator&) = 0;
};
virtual const iterator begin() = 0;
virtual const iterator end() = 0;
};
Наследник CCHash:
class CCHash : public AbstractHash <T, K>
{
class iterator {
public:
const iterator& operator=(const iterator&);
T& operator*();
const iterator& operator++();
const iterator operator++(int);
const iterator& operator--();
const iterator operator--(int);
const bool operator==(const iterator&);
const bool operator!=(const iterator&);
};
const iterator begin(); //здесь ошибка
const iterator end(); //здесь ошибка
};
Ответы (1 шт):
У вас определено два разных вложенных класса iterator. Один AbstractHash::iterator, а второй CCHash::iterator соответственно. Это два разных класса, между которыми нет никакого отношение наследования, в отличие от оригинальных классов AbstractHash и CCHash. Соответственно когда в CCHash возвращаете для виртуальной функции begin тип CCHash::iterator выдается ошибка, так как в базовом классе AbstractHash begin возвращает тип AbstractHash::iterator, в который CCHash::iterator не может быть сконвертирован.