Рассмотрим следующий сценарий:
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?