W variousexplanations słowa kluczowego C++ 11: final
, widzę przykłady takie jak to.Czy istnieje jakiś sens w oznaczaniu funkcji klasy podstawowej jako wirtualnej i końcowej?
class base
{
public:
virtual void f() final;
};
class derived : public base
{
public:
virtual void f(); // Illegal due to base::f() declared final.
};
Czy to jest rzeczywiście użyteczne użycie final
? Dlaczego zadeklarowałbyś funkcję wirtualną w klasie bazowej (sugerując, że będzie ona użytecznie nadpisywalna w klasach pochodnych), a następnie natychmiast oznaczysz ją jako final
(negując tę implikację)? Jaka jest użyteczność virtual void f() final
?
Widzę wartość oznaczającą derived::f()
końcowy zamiast base::f()
. W tym przypadku, base::f()
prawdopodobnie miał dobry, oparty na wzornictwie, powód, dla którego f()
powinien być wirtualny, a derived::f()
osobno ma dobry, oparty na wzornictwie, powód, dla którego żadna inna klasa pochodna nie powinna unieważnić jego implementacji.
Jeśli nie chcesz, aby funkcja była zastępowana polimorficznie, dlaczego nie chcesz po prostu wyłączyć wirtualnego słowa kluczowego? Oczywiście klasy pochodne mogą nadal nadpisywać funkcję nie-polimorficznie. Czy celem klasy virtual void f() final
w klasie bazowej jest zatem, aby w żaden sposób nie nadawać się do zmieniania - zarówno jako funkcja wirtualna, jak i nie-wirtualna? Jeśli tak, to wydaje się trochę niefortunne, że musimy dodać słowo kluczowe virtual
w tym przypadku tylko, aby umożliwić korzystanie z final
. Sądzę, że wtedy powinno być legalne oznaczanie funkcji nie-wirtualnych jako ostatecznych.
Dlaczego używać virtual void f() final
dla funkcji wywodzącej się z klasy bazowej, gdy wydaje się, że poczucie virtual
i poczucie final
są sprzeczne?
Przykładami są * przykłady *; mają na celu pokazać, co robi ta funkcja, niekoniecznie jak dokładnie z niej korzystać. W ten sposób używa się tylko dwóch klas, aby pokazać, co oznacza słowo "ostateczny". Aby użyć przykładu z prawdziwego świata, potrzebowalibyśmy * trzech *: jednego do zainicjowania wirtualnego, jednego do wyprowadzenia z niego i bycia "ostatecznym", a trzeciego do próby wyprowadzenia z niego i przeładowania go. Ta droga jest krótsza. –
@NicolBolas Rozumiem cel przykładów. Ale czy ten konkretny przykład pokazuje również użyteczny paradygmat do zastosowania? Oto jest pytanie. – OldPeculier