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

Od Petr Zemek, 2015-08-05

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 ;).

Obsah tohoto pole je soukromý a nebude veřejně zobrazen.

Filtrované HTML (využíváno)

  • Povolené HTML značky: <a href hreflang> <em> <strong> <cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <table>
  • Zvýraznění syntaxe kódu lze povolit přes následující značky: <code>, <blockcode>, <bash>, <c>, <cpp>, <haskell>, <html>, <java>, <javascript>, <latex>, <perl>, <php>, <python>, <ruby>, <rust>, <sql>, <text>, <vim>, <xml>, <yaml>.
  • Řádky a odstavce se zalomí automaticky.
  • Webové a e-mailové adresy jsou automaticky převedeny na odkazy.
CAPTCHA
2 + 1 =
Vyřešte tento jednoduchý matematický příklad a vložte výsledek. Např. pro 1+3 vložte 4.
Nějak se mi tady rozmohl spam, takže poprosím o ověření.