C++ 11 hinzugefügt endgültig.Bedeutet C++ final in allen Aspekten endgültig?
Endlich!
Ich verstehe final
macht zwei Dinge:
- Macht eine Klasse nicht vererbbar.
- Macht (virtuelle) Funktionen in einer Klasse nicht überschreibbar (in einer abgeleiteten Klasse).
Beide scheinen voneinander unabhängig zu sein. Aber zum Beispiel nehmen die folgenden:
class Foo
{
public:
virtual void bar()
{
//do something unimportant.
}
};
class Baz final : public Foo
{
public:
void bar() /*final*/ override
{
//do something more important than Foo's bar.
}
};
Von oben, glaube ich Baz
final
zu sein, ich sollte NICHT müssen angeben, dass seine virtual
Memberfunktion bar
auch final
ist. Da Baz
nicht vererbt werden kann, geht die Frage des Überschreibens bar
nicht in den Geltungsbereich. Allerdings ist mein Compiler VC++ 2015 sehr leise darüber. Das habe ich im Moment noch nicht getestet.
Ich würde mich freuen, wenn jemand etwas Licht zu diesem Thema geben könnte. Ein Zitat aus dem Standard (falls vorhanden) würde sehr geschätzt werden. Bitte geben Sie auch Eckfälle an, die mir nicht bekannt sind und die meinen logischen Glauben zum Scheitern bringen könnten.
Also, meine Frage ist: einefinal class
implizit implizieren seinevirtual
Funktionen Doesfinal
als auch sein? Sollte es? Bitte klären Sie.
Der Grund Ich frage dies, weil final
Funktionen qualifiziert werden für de-Virtualisierung, die eine große Optimierung ist. Jede Hilfe wird geschätzt.
finale Funktionen werden nur dann de-virtualisiert, wenn der statische Typ mit dem übereinstimmt, in dem die Funktion final ist. Happenes selten, und ist oft ein Hinweis darauf, dass überhaupt kein virtuelles benötigt wird. – SergeyA
@SergeyA Ja. Deshalb habe ich qualifiziert geschrieben. –
Wenn der Compiler garantieren kann, dass er keinen virtuellen Aufruf benötigt, wird er keinen virtuellen Aufruf einfügen (als Optimierung). Der Compiler ist clever und hat dies bereits vor der Einführung von final getan. Aber ich nehme an, es ist jetzt einfacher. –