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á vA
vů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 ;).