Mam klasę bazową z funkcją wirtualną i chcę przesłonić tę funkcję w klasie pochodnej. Czy istnieje sposób, aby kompilator sprawdzał, czy funkcja, którą zadeklarowałem w klasie pochodnej, faktycznie przesłania funkcję w klasie bazowej? Chciałbym dodać jakieś makro lub coś, co zapewnia, że nie zadeklarowałem przypadkowo nowej funkcji, zamiast nadpisać starą.
Weź ten przykład:
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);
}
Here parent::handle_event()
jest wywoływana zamiast child::handle_event()
, ponieważ metoda dziecka pomija const
deklarację i dlatego deklaruje nową metodę. Może to być również literówka w nazwie funkcji lub niewielka różnica w typach parametrów. Może się to również łatwo zdarzyć, jeśli interfejs klasy bazowej zmieni się i gdzieś jakaś klasa pochodna nie zostanie zaktualizowana, aby odzwierciedlić zmianę.
Czy jest jakiś sposób na uniknięcie tego problemu, czy mogę w jakiś sposób powiedzieć kompilatorowi lub innemu narzędziu, aby to sprawdził? Jakieś pomocne flagi kompilatora (najlepiej dla g ++)? Jak uniknąć tych problemów?