C++ typeof Äquivalent / switch nach Objekttyp
-
Bringt
final
da wirklich was?Der üblicher Fall ist doch dass die Stelle wo der kritische Aufruf steht eben gerade nicht in der
final
Klasse ist (bzw. nicht in der Klasse wo die aufgerufene Funktionfinal
wird).Und dann bringt es dem Compiler schätze ich nicht viel zu wissen dass bestimmte abgeleitete Klassen
final
wären.Er muss also trotzdem ein
if (this->vtbl->fun[123] == &Derived1::Fun)
o.Ä. reinknallen. Und das reicht auch ohnefinal
.Die schwierigen Fragen für den Compiler sind denke ich eher: wo zahl sich das überhaupt aus und welche abgeleiteten Klassen sollten als Kandidaten geprüft werden?
-
Wenn du den Fall, in dem final in diesem Zusammenhang etwas bringen würde, als unrealistisch weg definierst (womit du aber durchaus Recht haben magst), dann bringt es natürlich nichts
-
Also, final bringt nur dann was, wenn der Compiler den most derived type nicht kennt, aber trotzdem noch Zusatzinformationen hat.
Also z.B. hier:
Base* base=createObject(); static_cast<Derived*>(base)->foo();
Ohne final in Derived::foo() resultiert das trotzdem in einen virtuellen Funktionsaufruf, mit final kann Derived::foo() direkt aufgerufen werden.
Wenn man
static_cast<Derived*>(base)->Derived::foo()
schreibt, ist's eh egal.
-
;qwerty schrieb:
Wenn man
static_cast<Derived*>(base)->Derived::foo()
schreibt, ist's eh egal.Ich denke typisch ist eher der Fall
base->foo()
.
Und da bringtfinal
wohl auch wenig.
-
hustbaer schrieb:
Bringt
final
da wirklich was?Sobald der Compiler alle Blätter kennt, kann er switch machen.
Das sehe ich jetzt eigentlich nur, wenn man eine Library als DLL zur Verfügung stellt. Ohne final kann man in der DLL keine Blätter haben (in der EXE schon).
-
volkard, ich hab keine Ahnung was du meinst.
Wieso sollte es wichtig sein zu wissen was Blätter sind und was nicht?
Und wieso sollte man das wissen müssen damit der Compiler "switch machen" kann? Der Compiler kann immer "switch machen", er muss nur im Normalfall einendefault
Zweig einbauen der den Aufruf ganz normal über den Vtable macht.
-
hustbaer schrieb:
er muss nur im Normalfall einen
default
Zweig einbauen der den Aufruf ganz normal über den Vtable macht.stimmt. dann sehe ich erstmal keinen vorteil in final.