none
virtuelle Funktion vs. Zeiger auf nicht virtuelle Memberfunktion RRS feed

  • Allgemeine Diskussion

  • Gibt es einen Unterschied zwischen virtuellen Funktionen und einem Zeiger auf eine nicht virtuelle (aber auch nicht statische) Memberfunktion?? ... wird bei der virtuellen Funktion noch der this-Zeiger umgerechnet? ...

    Rudolf

    Donnerstag, 15. September 2011 13:20

Alle Antworten

  • Eigentlich nicht. Funktionszeiger auf Klassen sind immer gleich, ob die Memberfunktion nun virtuell oder nicht virtuell ist, spielt da IMHO keine Rolle.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Donnerstag, 15. September 2011 13:30
    Moderator
  • *hmm* ... ok... ich trau dem ganzen nicht richtig... ich mach's mit statischen Funktionen und einem eigenen this-Zeiger...

    Rudolf

    Donnerstag, 15. September 2011 15:23
  • Lies Die mal das an:
    http://www.codeproject.com/KB/cpp/FastDelegate.aspx
    Member function pointer schauen zwar etwas komplitziert aus, aber sie sind extremst leistungsfähig.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Donnerstag, 15. September 2011 16:15
    Moderator
  • So würde ich das jetzt nicht sagen...

    Bei virtuellen Funktionen wird teilweise viel mehr benötigt als nur der "this" Zeiger; nur sind die Daten eben durch das "this" erreichbar...

    Nicht das es nacher heisst virtuel und nicht virtuel ist kein Unterschied bzgl. der Größe der Klasse....

    Siehe auch:
    http://www.cprogramming.com/tutorial/size_of_class_object.html

    Dazu gibt es auch noch diverse Optionen im Compiler, die man in besonderen Fällen aktivieren muss...
    /vm*
    http://msdn.microsoft.com/en-us/library/yad46a6z.aspx


    Jochen Kalmbach (MVP VC++)
    Donnerstag, 15. September 2011 17:16
  • Ja, genau sowas dachte ich mir eben auch... und das ist alles mehr oder weniger "undurchsichtig" ... daher wähle ich den 100% korrekten Weg, der mit der statischen Funktion... da kann nix schief gehen :-)
    Donnerstag, 15. September 2011 18:23
  • Sicher ist der Zeiger etwas komplexeres. Aber wenn er korrekt definiert ist ist alles heile. Man kann ihn eben nur nicht wie einen anderen Zeiger einfach casten... und da spielt es keine Rolle ob das nun eine virtuelle oder normale Memberfunktion ist.

    Und besagter Schalter ist letzten Endes nur eine "Verwendungsart". Man kann mit beiden leben. ;)

     

    Und "undurchsichtig" scheint es manchem C++ Entiwckler nur weil ein solcher Zeiger eben nicht in einen void* passt...

    Wenn Rudolf, dass mit ienem eigenen this Zeiger und einer statischen Funktion macht, dann schreibt er letzten Endes genau solch eine Implementierung.


    Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de
    Donnerstag, 15. September 2011 18:47
    Moderator
  • Wenn Rudolf, dass mit ienem eigenen this Zeiger und einer statischen Funktion macht, dann schreibt er letzten Endes genau solch eine Implementierung.


    Genau, aber die kann ich kontrollieren... sonst müsste ich dem Compiler vertrauen...  :-)
    Donnerstag, 15. September 2011 19:09
  • Genau, aber die kann ich kontrollieren... sonst müsste ich dem Compiler vertrauen...  :-)

    Hmm, wenn du dem Compiler nicht traust, schreib doch nen UnitTest :-)

    Interessante Diskussion, wenn ich in so eine Frage gerate, würde ich mich gegen virtuelle Methoden und für Statische Polymorphie entscheiden, wenn das möglich ist. Seit dem Lambda Zeitalter von C++0x sieht das aber auch wieder anders aus. Zumindest war das  in etwa das Ergebnis einer Diskussion, die wir vor kurzem mit Nicolai Josuttis hatten (ehemaliges Mitglied im C++-DIN-Arbeitskreis und deutscher Vertreter bei der Standardisierung von C++). Leider ist er hier im Forum nicht vertreten, soweit ich weiß.

    In dem Zusammenhang ist das hier auch nicht uninteressant, wenn es um pure interfaces geht: novtable

    Aber zurück zum Thema, Martin schrieb, dass man Zeiger nicht einfach casten kann, soweit ich weiß, empfiehlt das Standardkomitee für solche Fälle den reinterpret_cast, habe ich mal irgendwo gelesen, wie der VC++ Compiler das sieht, werde ich auch bald nochmal austesten. Interessant wird das ganze dann noch bei multiple inheritance. Dabei gab es zumindest mal einen Bug im Compiler, der dazu führte, dass der this Zeiger falsch aufgelöst wurde, wenn ich den Link noch finde, poste ich ihn später mal.

    IMHO, zur eigentlichen Frage steht die Antwort hier: Pointers to Members and Virtual Functions

    Gruß


    "It's time to kick ass and chew bubble gum... and I'm all outta gum." - Duke Nukem
    Donnerstag, 15. September 2011 21:39
  • Also was echt cool wär, wäre wenn man die Tabelle der virtuellen Funktionen manipulieren könnte... das wär genau das, was ich im Moment brauchen könnte... aber gut, statisch geht's ja.

    Rudolf

    Sonntag, 18. September 2011 10:53
  • Ja, genau sowas dachte ich mir eben auch... und das ist alles mehr oder weniger "undurchsichtig" ... daher wähle ich den 100% korrekten Weg, der mit der statischen Funktion... da kann nix schief gehen :-)

    Was genau ist denn undurchsichtig?


    "It's time to kick ass and chew bubble gum... and I'm all outta gum." - Duke Nukem
    Mittwoch, 21. September 2011 20:41
  • Wie das mit dem this-Zeiger abläuft und wie die Parameter übergeben werden ist (theoretisch) jedem Compiler selber überlassen... daher kann ich mir vorstellen, dass es hier schon zu bösen Problemen kommen kann, wenn man selber was bastelt.
    Donnerstag, 22. September 2011 21:27
  • Hi Rudolf,

    hier ist ein Link, der Dir vielleicht hilfreich sein kann: http://msdn.microsoft.com/en-us/library/ek8tkfbw(v=VS.100).aspx (__thiscall).


    "It's time to kick ass and chew bubble gum... and I'm all outta gum." - Duke Nukem
    Donnerstag, 22. September 2011 23:35