У мене базовий клас з віртуальною функцією, і я хочу перекрити цю функцію у похідному класі. Чи є якийсь спосіб змусити компілятор перевірити, чи дійсно функція, яку я декларував у похідному класі, перекриває функцію в базовому класі? Я хотів би додати якийсь макрос або щось, що гарантує, що я випадково не оголосив нову функцію, замість того, щоб переосмислити стару.
Візьмемо цей приклад:
class parent {
public:
virtual void handle_event(int something) const {
// boring default code
}
};
class child : public parent {
public:
virtual void handle_event(int something) {
// new exciting code
}
};
int main() {
parent *p = new child();
p->handle_event(1);
}
Тут parent::handle_event()
називається замість child::handle_event()
, тому що метод дитини пропускає const
декларацію і тому оголошує новий метод. Це також може бути помилка в назві функції або незначна різниця в типах параметрів. Це також може статися легко, якщо зміниться інтерфейс базового класу, і десь якийсь похідний клас не був оновлений, щоб відобразити зміни.
Чи є якийсь спосіб уникнути цієї проблеми, чи можу я якось сказати компілятору чи іншому інструменту, щоб перевірити це на мені? Будь-які корисні прапори компілятора (бажано для g ++)? Як уникнути цих проблем?