Ich habe eine Basisklasse mit einer virtuellen Funktion und möchte diese Funktion in einer abgeleiteten Klasse überschreiben. Gibt es eine Möglichkeit, den Compiler überprüfen zu lassen, ob die in der abgeleiteten Klasse deklarierte Funktion tatsächlich eine Funktion in der Basisklasse überschreibt? Ich möchte ein Makro oder etwas hinzufügen, das sicherstellt, dass ich nicht versehentlich eine neue Funktion deklariert habe, anstatt die alte zu überschreiben.
Nehmen Sie dieses Beispiel:
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);
}
Hier parent::handle_event()
wird statt aufgerufen child::handle_event()
, weil die Methode des Kindes die const
Deklaration verfehlt und daher eine neue Methode deklariert. Dies kann auch ein Tippfehler im Funktionsnamen oder ein geringfügiger Unterschied in den Parametertypen sein. Es kann auch leicht vorkommen, dass sich die Schnittstelle der Basisklasse ändert und irgendwo eine abgeleitete Klasse nicht aktualisiert wurde, um die Änderung widerzuspiegeln.
Gibt es eine Möglichkeit, dieses Problem zu vermeiden? Kann ich dem Compiler oder einem anderen Tool irgendwie sagen, dass er dies für mich überprüfen soll? Irgendwelche hilfreichen Compiler-Flags (vorzugsweise für g ++)? Wie vermeiden Sie diese Probleme?