C++ typeof Äquivalent / switch nach Objekttyp
-
Bringt
finalda wirklich was?Der üblicher Fall ist doch dass die Stelle wo der kritische Aufruf steht eben gerade nicht in der
finalKlasse ist (bzw. nicht in der Klasse wo die aufgerufene Funktionfinalwird).Und dann bringt es dem Compiler schätze ich nicht viel zu wissen dass bestimmte abgeleitete Klassen
finalwä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 bringtfinalwohl auch wenig.
-
hustbaer schrieb:
Bringt
finalda 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 einendefaultZweig einbauen der den Aufruf ganz normal über den Vtable macht.
-
hustbaer schrieb:
er muss nur im Normalfall einen
defaultZweig einbauen der den Aufruf ganz normal über den Vtable macht.stimmt. dann sehe ich erstmal keinen vorteil in final.