Не удается создать экземпляр абстрактного класса - PullRequest
0 голосов
/ 26 мая 2019

У меня есть базовый класс abastract Employee с чистым виртуальным методом clone

virtual Employee* clone() const = 0;

Также у меня есть производный класс DeveloperEmployee, который переопределяет этот метод:

DeveloperEmployee* clone() const override {
        return new DeveloperEmployee(this->description, this->project);
}

Теперь у меня есть эти строки в main:

DeveloperEmployee* a = new DeveloperEmployee(description, project);
DeveloperEmployee* a_copy = a->clone();

И я не могу изменить эти строки.Он говорит мне, что я не могу создать экземпляр абстрактного класса, так как я должен изменить код?

Если я изменяю переопределенный метод на

Employee* clone() const override {
        return new DeveloperEmployee(this->description, this->project);
}

У меня есть проблема приведения в main, и я не могуизменить основной.

Ответы [ 2 ]

3 голосов
/ 26 мая 2019

Я не уверен, что другие ответы подразумевают под "вы не переопределяете, потому что тип возврата отличается".Тип возвращаемого значения не является частью сигнатуры функции, и вполне возможно изменить тип возвращаемого значения на производное, при условии, что возвращаемый тип изначально был указателем или ссылкой на тип (то есть они ковариантные типы - спасибо за ссылку HolyBlackCat).

Следующий пример компилируется (с предупреждением о неиспользуемой переменной). Смотрите это онлайн! :

class A{
public:
    virtual A* foo() const = 0;
};

class B:public A{
public:
    B* foo() const override {return new B();}
};

int main() {
    B b;
    A* ptr = b.foo();
}

Если это не разрешено, компилятор выдаст ошибку благодаря ключевому слову override, например, в GCC:

prog.cc:12:17: error: conflicting return type specified for 'virtual 

std::__cxx11::string B::bar()'
     std::string bar() override { return {}; }
                 ^~~
prog.cc:6:20: note: overridden function is 'virtual double A::bar()'
     virtual double bar() = 0;
                    ^~~

Проблема в коде, который вы не показываете.Возможно, вы пытаетесь создать переменную типа Employee где-нибудь?

0 голосов
/ 26 мая 2019

DeveloperEmployee* clone() const override не может переопределить virtual Employee* clone() const, так как возвращаемые типы различны.Пока вы не переопределите virtual Employee* clone() const, вы не сможете создать экземпляр DeveloperEmployee, поскольку это чисто виртуальная функция.

DeveloperEmployee должно иметь следующее определение.

Employee* clone() const override {
        return new DeveloperEmployee(this->description, this->project);
}

Трудно понять, что вы подразумеваете под тем, что вы не можете изменить основной, но для использования полиморфизма в идеале вы должны создать указатель базового класса, присвоить ему адрес объекта производного класса и передать указатель вокруг.

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