Производный класс абстрактного базового класса неправильно корректирует базовый чистый виртуальный метод - PullRequest
0 голосов
/ 09 апреля 2019

Итак, я пытаюсь создать производный класс класса Abstract Base, но чистые виртуальные методы не могут быть объявлены с использованием класса Derived.

template<class T>
class Foo
{
    public:
        virtual Foo<T>* add(const Foo<T>* rhs) = 0; 
};

template<class T>
class Doo : public Foo<T>
{
    public:
        Doo<T>* add(const Doo<T>* rhs)
        {
            return this;
        }
};

int main()
{
    Doo<double> d;
    return 0;
}

Я ожидал, что объявление метода add в Doo сработает, потому что Doo является подклассом Foo, но g ++ говорит, что я не переопределяю Foo's метод add. Я предполагаю, что это что-то простое с тем, как я объявляю Doo's метод добавления.

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Используя функцию с другой подписью, вы скрыли функцию вместо ее переопределения.

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

Doo<T>* add(const Doo<T>* rhs) override

А затем компилятор выдаст ошибку, если функция фактически не переопределит.

0 голосов
/ 09 апреля 2019

Подписи не совпадают, поэтому вы ничего не переопределяете.Найдите ключевое слово override, чтобы компилятор помог вам диагностировать подобные ошибки.

add(const Foo<T>* rhs)

- это не то же самое, что

add(const Doo<T>* rhs)

Они принимают разные аргументы.

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

...