Virtuelle Funktionen vergleichen
-
Hallo,
da ich mich hier anderweitig gerade mit Langeweile rumplage, wollte ich mal fragen, warum genau der Gedanke hinter folgendem Quelltext als "illegal" standardisiert wurde:#include <iostream> class a { public: virtual int some( float a ) { return 1; } }; class b : public a { public: int some( float a ) { return 2; } }; int _tmain(int argc, _TCHAR* argv[]) { a a1, a2; b b1; std::cout << (a1.some == a2.some) << (b1.some == a1.some); return 0; }Also fernab von schlechtem Design etc, was ist der springende Gedanke um sowas nicht zuzulassen?
Danke für eure Zeite im voraus und viele Grüße,
Michael
-
Weil es garnicht das machen würde, was du erwartest.
Es würde hier zB kein virtual dispatching passieren.Einen Zeiger auf eine Funktion bekommst du so:
std::cout << (&a::some == &a::some);
-
Naja, wie ich gültige Zeiger bekomme, weiß ich ja.
Woher weißt du denn, dass es nicht das machen würde, was ich erwarten würde? Im Moment sagt mir der Standard ja nur: Darfst du nicht. Würde ihn ein technisches Problem daran hindern, das zu tun, was ich erwarte?
-
Decimad schrieb:
Würde ihn ein technisches Problem daran hindern, das zu tun, was ich erwarte?

Es müsste wie ein spezialfall behandelt werden. es ist viel einfacher zu sagen: geht nicht. Also hier das komplette dispatching hochzuziehen.
Was willst du denn damit erreichen?
-
Ach ich war gerade so am überlegen, wie ich Hit-Testing in mein Fenstersystem reinbasteln könnte und kam dann auf die Idee, dass der Manager sozusagen automatisch schauen könnte, ob irgendeines der Widgets überhaupt was besonderes tut und ansonsten eine "Fastpath" benutzen kann. Wäre natürlich ziemlich undurchsichtig für den Benutzer, war halt nur so eine fixe Idee
Man könnte so auch Warnungen rausschmeißen ala "Objekt sagt, es macht was besonderes, aber überlädt die virtuelle Methode nicht", keine Ahnung wann man sowas mal braucht, siehe oben, fixer Gedanke 