class BaseHandler
{
public:
virtual void handle(BaseArg* arg) = 0;
};
Вы объявляете виртуальную функцию handle
, которая должна иметь возможность принимать любой тип BaseArg
.
class DerivedHandler : public BaseHandler
{
public:
void handle(DerivedArg* arg) { }
};
Ваша переопределяющая функция просто принимает одну конкретнуютипа BaseArg
, поэтому недостаточно предоставить реализацию для (более общей!) унаследованной функции handle
.Другой способ сработал бы (только в теории, см. Ниже) - или он (верно) работал бы с типом возвращаемого значения, так как DerivedArg
всегда возвращает BaseArg
тоже ...
Для обзора:
class Base
{
public:
virtual void f0(BaseArg* arg) = 0;
virtual void f1(DerivedArg* arg) = 0;
virtual BaseArg* f2() = 0;
virtual DerivedArg* f3() = 0;
};
class Derived : public Base
{
public:
virtual void f0(DerivedArg* arg) override; // FAILS!
virtual void f1(BaseArg* arg) override; // (fine...)(*)
virtual DerivedArg* f2() override; // fine...
virtual BaseArg* f3() override; // FAILS!
};
(*) На самом деле, этот случай был бы в порядке в теории .C ++, однако, не поддерживает аргументы контравариантной функции, поэтому этот случай также завершится ошибкой (новая функция считается только перегрузкой)!
Для получения дополнительной информации посмотрите Wikipedia .