Final ne peut pas être appliqué aux fonctions non virtuelles.
error: only virtual member functions can be marked 'final'
Il ne serait pas très significatif de pouvoir marquer une méthode non virtuelle comme «finale». Donné
struct A { void foo(); };
struct B : public A { void foo(); };
A * a = new B;
a -> foo(); // this will call A :: foo anyway, regardless of whether there is a B::foo
a->foo()
appellera toujours A::foo
.
Mais, si A :: foo l'était virtual
, alors B :: foo le remplacerait. Cela pourrait être indésirable, et il serait donc logique de rendre la fonction virtuelle définitive.
La question est cependant de savoir pourquoi autoriser les fonctions finales sur les fonctions virtuelles. Si vous avez une hiérarchie profonde:
struct A { virtual void foo(); };
struct B : public A { virtual void foo(); };
struct C : public B { virtual void foo() final; };
struct D : public C { /* cannot override foo */ };
Ensuite, le final
«plancher» sur combien de dépassement peut être fait. D'autres classes peuvent étendre A et B et les remplacer foo
, mais si une classe étend C, ce n'est pas autorisé.
Donc, cela n'a probablement pas de sens de faire le toto «de premier niveau» final
, mais cela pourrait avoir un sens plus bas.
(Je pense cependant qu'il est possible d'étendre les mots final et de priorité aux membres non virtuels. Ils auraient cependant une signification différente.)
virtual
mot - clé ou non.