Виртуальная функция переопределяется в других базовых классах - PullRequest
0 голосов
/ 07 ноября 2019

Рассмотрим этот фрагмент кода:

#include <bits/stdc++.h>
using namespace std;

class Mammal;
class Operation;

class Animal{
    public:
        virtual void doOp(Operation* op) = 0;
};

class Mammal{
    public:
        void doOp(Operation* op){
            op->thisIsMammal(this);
        }
};

class Pig:  public Mammal, public Animal{

};

class Operation{
    public: 
        void thisIsMammal(Mammal* mammal){
            cout << "This is a mammal!" << endl;
        }
};

int main(){
    Pig  pig;
    Operation op;
    pig.doOp(&op);
    return 0;
}

В классе Animal объявлена ​​виртуальная функция, которую необходимо переопределить в классе Pig. Тем не менее, Pig происходит от Mammal, у которого есть определение этой функции

Я все еще получаю ошибку, что функция не была переопределена в производном классе. Есть ли способ сделать определение в Mammal достаточным?

Ответы [ 2 ]

2 голосов
/ 07 ноября 2019

Однако, Свинья происходит от Млекопитающего, у которого есть определение этой функции

Нет, это не так. Mammal не переопределяет функцию Animal::doOp, потому что Mammal не наследует Animal.

Простое решение - извлечь Mammal из Animal и удалить базу Animal изPig:

class Mammal : public Animal {

class Pig :  public Mammal {
0 голосов
/ 07 ноября 2019

Mammal в вашем коде не является производным от Animal, поэтому он не может переопределить виртуальную функцию Animal::doOp(). Определение функции-члена Mammal::doOp() в вашем коде просто определяет не-virtual функцию с именем doOp(). Это ничего не отменяет.

Попробуйте использовать спецификатор override (начиная с C ++ 11).

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

class Mammal{
    public:
        void doOp(Operation* op) override {
            op->thisIsMammal(this);
        }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...