Od C++11 je k dispozici specifikátor override. Lze pomocí něj označit virtuální metodu, která předefinovává (anglicky overrides) virtuální metodu z nadtřídy. V příspěvku uvedu dva důvody, proč je dobré všechny takovéto metody tímto specifikátorem označovat.
Jdeme na to. Mějme následující kód:
class B: public A { // ... virtual void foo(int i); };
kde A je bázová třída od B. Zkuste nyní (bez znalosti A) odpovědět na následující dvě otázky:
- Jedná se o předefinování metody
foo()z nadtřídy, nebo se jedná o metodu, která vAvůbec není? - Pokud se jedná o předefinování, je to skutečně předefinování (tj. sedí typy atd.), nebo se programátor spletl?
Pokud je vaše odpověď ta, že to bez podívání se na A nelze určit, tak je to správná odpověď :). Co když však změníme definici B takto:
class B: public A { // ... virtual void foo(int i) override; };
Nyní je ihned jasné, že foo() je metoda z nadtřídy. Navíc, překladač za nás zkontroluje, že opravdu došlo k předefinování, tedy že v A je daná metoda stejné signatury. To se velmi hodí z následujícího důvodu. Představte si, že v budoucnu někdo změní definici třídy A tak, že ona metoda foo() bude mít místo jednoho parametru dva parametry. Pokud override nepoužijete, tak může dojít k tomu, že kód bude přeložitelný, ale bude dělat něco jiného, protože B::foo() již není předefinování. Jestliže však override použijete, překladač zahlásí chybu:
error: ‘virtual void B::foo(int)’ marked ‘override’, but does not override virtual void foo(int i) override;
Perfektní. Čím dříve dojde k odhalení chyby, tím lépe.
Shrnutí
Abych to tedy shrnul, od C++11 je dobré pomocí override konzistentně označovat všechna předefinování metod, a to z následujících dvou důvodů:
- Dáváte tím čtenáři najevo, že se jedná o předefinování metody z nadtřídy.
- Překladač zkontroluje, že se opravdu jedná o předefinování.
Perlička na závěr
Na závěr jsem si nechal jednu zajímavost. override není klíčové ani rezervované slovo, pouze tzv. identifikátor se speciálním významem [§2.11.2]. Onen speciální význam je právě to, o co nám jde. Je to však závislé na kontextu. Můžete si totiž bez problému vytvořit např. proměnnou s tímto názvem. Samozřejmě, to, že něco můžete udělat ještě neznamená, že byste měli ;).