Jste zde

Proč v C++ využívat specifikátor override

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:

  1. Jedná se o předefinování metody foo() z nadtřídy, nebo se jedná o metodu, která v A vůbec není?
  2. 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ů:

  1. Dáváte tím čtenáři najevo, že se jedná o předefinování metody z nadtřídy.
  2. 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 ;).

Přidat komentář