Наследование - обязательно ли переопределять все виртуальные функции?

Есть базовый абстрактный класс:

class Duck{
protected:
    FlyBehavior *flyBehavior;
    QuackBehavior *quackBehavior;
public:
    Duck () {}
    virtual void display() = 0;
    virtual void performFly() = 0;
    virtual void performQuack() = 0;
    virtual void swim() = 0;
};

Есть класс-наследник:

class MallardDuck : public Duck
{
public:
    MallardDuck(){
        quackBehavior = new Quack();
        flyBehavior = new FlyWithWings();
    }

    void display() {
        std::cout << "I'm a real Mallard duck" << std::endl;
    }
    void performFly() {
        Duck::performFly();
    }
    void performQuack() {
        Duck::performQuack();
    }
    void swim() {
        Duck::swim();
    }
};

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


Ответы (1 шт):

Автор решения: tirariharari

Если методы будут не абстрактными, но виртуальными их переопределять не надо.

→ Ссылка