Как бы я мог передать виртуальный метод через абстрактный класс, но при желании не переопределить? - PullRequest
1 голос
/ 09 июня 2019

Я пытаюсь передать виртуальный метод через абстрактный класс, но только некоторые из его производных классов переопределяют базовый метод, а другие запускают оригинальный метод.

class Animal {
    virtual void speak() {
         //generic speaking code
    }
}
class Mammal : Animal {
    virtual void speak() = 0;
    //allows speak to be overridden by derived class
}
class Dog : Mammal {
    //doesn't do anything special with speak(), should run generic speaking code
}
class Human : Mammal {
    void speak() {
        //overrides generic speaking code
    }
}

Я бы хотел вызывать говорить () из Собаки, чтобы запустить метод говорим () в Animal, но вызывал говорить () из Человека, чтобы запустить собственный метод разговора (). Как бы я пошел по этому поводу?

1 Ответ

4 голосов
/ 09 июня 2019

Вам не нужно это в Mammal:

virtual void speak() = 0;

Human все еще может переопределить speak() просто отлично, а Dog не нужно.Убедитесь, что вы используете публичное наследование, а не частное наследование.То есть:

class Mammal : public Animal {

вместо:

class Mammal : Animal {

В качестве примечания следует использовать ключевое слово override при переопределении виртуальных функций.Это помогает уловить довольно распространенную ошибку, когда вы думаете, что вы переопределяете функцию, а на самом деле вы просто перегружаете ее.Итак, ваш код должен быть:

class Animal {
public:
    virtual void speak()
    {}
};

class Mammal : public Animal {
};

class Dog : public Mammal {
};

class Human : public Mammal {
public:
    void speak() override
    {}
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...