Есть ли преимущество в использовании:

struct Base
{
    virtual void foobar();
};

struct Derived : public Base
{
    virtual void foobar() override;
};

Вместо того:

struct Base
{
    void foobar();
};

struct Derived : public Base
{
    void foobar();
};

Когда нет необходимости в динамическом полиморфизме / полиморфизме времени выполнения? Если да, то почему?

Спасибо.

c++
2
not an alien 10 Дек 2018 в 13:40

1 ответ

Лучший ответ

Библиотека / программа должны поддерживать только то, что имеет смысл, и если вы не намерены / хотите запретить, чтобы класс Derived был возможной заменой объекта типа Base, тогда вам не следует предлагают такую ​​возможность вообще.

С class Derived : public Base вы предлагаете полиморфизм, и если вы его предлагаете, он должен вести себя так, как вы ожидаете. Предложение члена с тем же именем, что и в базовом классе, но без его переопределения, явно не ожидается, и для этого у вас должны быть веские причины и хорошая документация.

Если вы не хотите предлагать полиморфизм, вы можете либо унаследовать private, либо составить:

class B {
public:
    int foo() { return 0; };
};

class D1 : private B {
public:
    int foo() { return B::foo() + 1; };
};

class D2 {
public:
    int foo() { return b.foo() + 1; };
private:
    B b;
};

int main() {

    // B *b = new D1;  // Error cannot cast to private base class B

    // B *b = new D2;  // D2 is not a subclass of B

}
3
Stephan Lechner 10 Дек 2018 в 11:09