Невозможно создать абстрактный класс, но класс не является параметром абстрактного / производного метода - PullRequest
0 голосов
/ 01 июня 2018

Почему я не могу создать новый экземпляр класса, который является производным от моего абстрактного базового класса?Мой производный класс имеет переопределенный базовый метод, но с другим параметром, который является производным классом параметра базового класса.

class BaseArg {

} ;

class DerivedArg :public BaseArg{

} ;

class BaseHandler{
public:
virtual void handle(BaseArg* arg) = 0;
} ;

DerivedHandler {
void handle(DerivedArg* arg) {}
} ;


auto x = new DerivedHandler() ;

Компилятор возвращает "Cannot Instantiate abstract class"

Почему?На мой взгляд, это должно работать.

1 Ответ

0 голосов
/ 01 июня 2018
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 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...