Как правильно унаследовать функции класса?

Есть 2 класса с практически идентичными функциями. Не могу разобраться, как правильно сделать наследование.

           class ListIterator {
                private:
                    node *data_;
                public:
                    ListIterator() noexcept : data_(nullptr) {};
                    ListIterator(const ListIterator &other) noexcept : data_(other.data_)  {}
                    ~ListIterator() noexcept {}
                    ListIterator(node *pointer) noexcept {
                        data_ = pointer;
                    }

                    reference operator*() {
                        CheckNull();
                        return data_->value_;
                    }
                    ListIterator &operator++() {
                        CheckNull();
                        data_ = data_->next;
                        return *this;
                    } 
                    ListIterator &operator--() {
                        CheckNull();
                        data_ = data_->prev;
                        return *this;
                    }
                    bool operator==(const ListIterator &it) const {
                        CheckNull();
                        it.CheckNull();
                        return data_ == it.data_;
                    }
                    bool operator!=(const ListIterator &it) const {
                        CheckNull();
                        it.CheckNull();
                        return data_ != it.data_;
                    }
                    node *get_data() const {
                        CheckNull();
                        return data_;
                    }
                private:
                    void CheckNull() const {
                        if (data_ == nullptr) {
                            throw(std::out_of_range("Iterator is at nullptr"));
                        }
                    }
            };
            class ListConstIterator : public ListIterator {
                private:
                    node *data_;
                public:
                    ListConstIterator() noexcept : data_(nullptr) {};
                    ListConstIterator(const ListConstIterator &other) noexcept : data_(other.data_)  {}
                    ~ListConstIterator() noexcept {}
                    ListConstIterator(node *pointer) noexcept {
                        data_ = pointer;
                    }
                    const_reference operator*() const {
                        if (data_ == nullptr) {
                            throw(std::out_of_range("Iterator is at nullptr"));
                        }
                        return data_->value_;
                    }
            };

                using iterator = ListIterator;
                using const_iterator = ListConstIterator;
                iterator begin() noexcept {
                    return iterator(empty_node->next);
                }
                iterator end() noexcept {
                    return iterator(empty_node);
                }

Сейчас я просто перенёс все функции из ListConstIterator в ListIterator. Но можно ли сделать наследование class ListIterator : public ConstListIterator и убрать из ListIterator все функции перегруженных операторов, но при этом, чтобы оно брало эти функции из унаследованного класса.

UPD. Ну вот так вот я делал изначально. Но как мне в этом случае создать объект const_iterator? Если пытаюсь, пишет, что нет соответствующего конструктора.


Ответы (0 шт):