Вам не нужно это в 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
{}
};