Specyfikator final.

W poprzednim wpisie z serii C++11 opisałem specyfikator override. Niejako w parze z nim występuje specyfikator final, który również odnosi się do przeciążania funkcji wirtualnych w klasach pochodnych.

Mówiąc krótko: jeśli nie chcemy, żeby funkcja wirtualna była dalej przeciążana (w kolejnych klasach pochodnych w hierarchii), możemy użyć słowa final w deklaracji funkcji – dokładnie tak samo, jak wykorzystujemy override.

Posłużę się tutaj przykładem z poprzedniego wpisu:

Dodałem specyfikator final na końcu deklaracji funkcji w klasie ClassA. Może się wydawać dziwne, że deklaruję funkcję wirtualną w klasie bazowej i od razu zabraniam jej przeciążania, ale ma to tylko pokazać efekt, jaki powoduje nasz kod.

Przy próbie kompilacji mamy błąd:

Nie możemy więc przeciążyć funkcji function w klasie pochodnej.

Override i final.

Kolejną ciekawą konstrukcją jest użycie jednocześnie obu specyfikatorów. Czy to ma sens ? Oczywiście.

Mamy więc:

W ten sposób wykorzystujemy cechy obu specyfikatorów, które są od siebie niezależne. Jesteśmy pewni, że funkcja zostanie poprawnie przeciążona w klasie ClassB. Jeśli natomiast chcielibyśmy utworzyć klasę dziedziczącą po ClassB i przeciążyć funkcję function – otrzymamy jasny komunikat o błędzie w czasie kompilacji.

Specyfikatory a słowa kluczowe.

Niektóre nowe funkcjonalności w C++ wprowadziły do języka nowe słowa kluczowe (np. nullptr). Jednak override i final są przypadkami specjalnymi. Oba słowa zostały zdefiniowane jako tzw. contextual keywords.

W dosłownym tłumaczeniu musiałbym powiedzieć, że są to kontekstowe słowa kluczowe, ale uważam takie określenie za nie do końca trafne. Z tego powodu nazywam je specyfikatorami, co wydaje się dość sensownym tłumaczeniem na język polski.

Oba specyfikatory nie są słowami kluczowymi. Są rozpoznawane jedynie w kontekście deklaracji funkcji wirtualnej. Oznacza to, że całkowicie poprawny jest poniższy kod:

Możemy użyć wspomnianych słów jako zwykłych identyfikatorów w C++ – np. dla nazw zmiennych. Osobną kwestią jest jednak sensowność takiego podejścia 🙂