Как объявить абстрактный итератор?

Пишу итератор для хэш-таблицы. Таблица может быть двух видов, поэтому использую полиморфизм. Нужно объявить итератор, но возникает ошибка:

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 шт):

Автор решения: retorta

У вас определено два разных вложенных класса iterator. Один AbstractHash::iterator, а второй CCHash::iterator соответственно. Это два разных класса, между которыми нет никакого отношение наследования, в отличие от оригинальных классов AbstractHash и CCHash. Соответственно когда в CCHash возвращаете для виртуальной функции begin тип CCHash::iterator выдается ошибка, так как в базовом классе AbstractHash begin возвращает тип AbstractHash::iterator, в который CCHash::iterator не может быть сконвертирован.

→ Ссылка