Final kann nicht auf nicht virtuelle Funktionen angewendet werden.
error: only virtual member functions can be marked 'final'
Es wäre nicht sehr sinnvoll, eine nicht virtuelle Methode als "endgültig" markieren zu können. Gegeben
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()
wird immer anrufen A::foo
.
Aber wenn A virtual
:: foo wäre, würde B :: foo es überschreiben. Dies könnte unerwünscht sein, und daher wäre es sinnvoll, die virtuelle Funktion endgültig zu machen.
Die Frage ist jedoch, warum endgültige virtuelle Funktionen zulässig sind. Wenn Sie eine tiefe Hierarchie haben:
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 */ };
Dann final
legt das einen "Boden" fest, wie viel Überschreiben getan werden kann. Andere Klassen können A und B erweitern und ihre überschreiben foo
, aber wenn eine Klasse C erweitert, ist dies nicht zulässig.
Es macht also wahrscheinlich keinen Sinn, das "Top-Level" -Foo zu machen final
, aber es könnte weiter unten Sinn machen.
(Ich denke jedoch, dass es Raum gibt, die Wörter final zu erweitern und auf nicht virtuelle Mitglieder zu überschreiben. Sie hätten jedoch eine andere Bedeutung.)
virtual
Schlüsselwort verwenden oder nicht.