Должен ли дочерний класс переопределять базовый пустой виртуальный метод с пустым виртуальным методом? - PullRequest
0 голосов
/ 17 июня 2020

Рассмотрим следующий сценарий:

class Base {
public:
    virtual void a() = 0;
    virtual void b() {} // Empty pass-through
    virtual void c() {} // Empty pass-through
    virtual void d() {} // Empty pass-through
};

Пустая передача означает, что производный класс может или не может переопределять эти методы с помощью значимого определения, например это:

class Child : public Base {
public:
    void a() override { /* implements pure virtual */ }
    void b() override { /* meaningful definition */ }
    void c() override {} ///< Empty body (also pass-through)
};

Обратите внимание, что Child не отменяет d(), но заменяет c() пустым телом.

Использование вызывающего абонента: (обратите внимание, что вызываются все методы, вызывающий не знает, был ли метод переопределен, поэтому вызываются пустые сквозные методы).

Base* base = new Child{};

while (shouldRepeat()) {
  base->a();
  base->b();
  base->c();
  base->d();
}

Вопрос: какой из этих двух подходил для класса Child?

  • переопределить метод c(), как я did
  • не отменять метод d(), как это сделал я

Меня больше волнует производительность. Возможно, здесь происходит что-то связанное с vtables?

...