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 Funktion final 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 ohne final .

    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?


  • Mod

    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 bringt final 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 einen default 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.


Anmelden zum Antworten