Fragensteller
virtuelle Funktion vs. Zeiger auf nicht virtuelle Memberfunktion

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
- Typ geändert Martin RichterModerator Montag, 2. Januar 2012 09:11
Alle Antworten
-
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 -
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.htmlDazu 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++) -
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 -
-
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 -
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 -
-
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