virtual
-
Obwohl ich kein virtual verwende wird es richtig aufgerufen.
Eigentlich sollte doch myfunk aus A aufgerufen werden oder.#include <iostream> using namespace std; class A{ public: void myfunk(){cout<<"Klasse A";}; }; class B:public A { public: void myfunk(){cout<<"Klasse B";}; }; int main() { B objekt; objekt.myfunk(); // Es wird myfunk von B aufgerufen }
-
objektist vom TypB, wieso sollte da also die Funktion vonAaufgerufen werden!?
-
Ok.
void rateMal(A *rate) { rate->myfunk(); }Es gibt wohl nur hier Probleme.
Wenn ich ein B Objekt übergebe, wird immer noch Klasse A aufgerufen.
Liegt das nur daran dass C performant ist und der Compiler keine Zeit hat sich anzuschauen dass eigentlich ein B Objekt übergeben wurde.Und wenn ich virtual verwende sage ich dem Compiler er soll doch bitte nochmal genauer hinschaun
Denn ich bin ja der Programmierer und weiß dass ich die gleiche Funktion in einer abgeleiteten Klasse nochmal verwende . So is es doch .
-
Du solltest einen P.I.-Zeiger verwenden, der kann virtual calls ohne overhead.
-
blurry333 schrieb:
Wenn ich ein B Objekt übergebe, wird immer noch Klasse A aufgerufen.
Liegt das nur daran dass C performant ist und der Compiler keine Zeit hat sich anzuschauen dass eigentlich ein B Objekt übergeben wurde.Du übergibst hier kein B Objekt, sondern einen Zeiger auf ein A. Der Grund warum nun die Methode von A aufgerufen wird ist, dass die Methode nicht virtual ist...
-
blurry333 schrieb:
Obwohl ich kein virtual verwende wird es richtig aufgerufen.
Eigentlich sollte doch myfunk aus A aufgerufen werden oder.Erinnerst Du Dich noch an die Grundschulzeit, als Dir das Fragezeichen beigebracht wurde?
Du gehst mir so auf die Nerven.
-
314159265358979 schrieb:
P.I.-Zeiger
Was meinst Du damit?
-
Sag bloß, du kennst keine P.I. Zeiger? Die speichern einen Funktionszeiger + Objektzeiger in 1 Byte rein und damit kann man virtual calls direkt machen, sogar mit weniger Speicherverbrauch als mit normalen Zeigern.
PI-Zeiger

-
314159265358979 schrieb:
Sag bloß, du kennst keine P.I. Zeiger?
Sonst hätte ich wohl nicht gefragt.
314159265358979 schrieb:
Die speichern einen Funktionszeiger + Objektzeiger in 1 Byte rein und damit kann man virtual calls direkt machen, sogar mit weniger Speicherverbrauch als mit normalen Zeigern.
Der Text bietet leider keine Referenz und auch nichts, nach dem man googeln könnte, wenn man wissen wollte, was das sein soll bzw wie es funktioniert.
-
Ach komm, dass das Blödsinn ist, ist dir doch bestimmt aufgefallen, oder?

-
@blurry: RTFM, STFW, GIYF. Was soll man da machen.
Virtuelle Methoden funkionieren so:
Für die dynamische Bindung wird zuerst im referenzierten Objekt der virtuelle Methoden-Zeiger auf die VMT(entsprechend der Klasse) ausgewertet, anschließend wird aus dieser die Adresse der virtuellen Methode verwendet. Da sagst du nich' dem Compiler, er soll nochmal genau nachschaun' was du willst.
-
Und was ist ein virtueller Methodenzeiger? :p
-
314159265358979 schrieb:
Und was ist ein virtueller Methodenzeiger? :p
Da du so ein erfahrener und erfolgreicher Software-Entwickler bist, hast du die überaus große Ehre, das zu präsentieren.


-
Ich hätte dich nicht gefragt, wenn ichs nicht wüsste. Virtueller Zeiger klingt aber voll toll. Erklär mal.
-
Wie wärs damit?:
Ein virtueller Methodenzeiger ist ein vom Compiler erzeugter (also interner) Funktionszeiger, der je virtueller Methode jedes Objektes diesen zur Verfügung gestellt wird.
-
Und was ist an dem Zeiger nun virtuell?
-
Das er erst zur Laufzeit erzeugt (und dereferenziert wird).
-
Ein Zeiger der zur Laufzeit erzeugt wird? Erklär das mal genauer.

-
Meinst du die vtable?!
-
wtfwtf schrieb:
Meinst du die vtable?!
VMT <-> Virtual Method Table.
Das er zur Laufzeit erzeugt wird, bedeutet im Endeffekt, dass der Programmierer keinerlei Kontakt mit ihm hat und ihn nicht Kontrollieren kann.
Der Zeiger existiert nur vorübergehend, um die Relationen in den Stammbäumen der Klassen im Bezug auf Virtuelle Methoden korrekt auszugleichen.
Du, Pi, hast auch schon mal versucht das nachzubauen.Ja, vtalble - so nennt Sie der Compiler.
Undefined reference to 'vtable for MyClass::~Myclass()'oder so ähnlich, das hat ich schon öfter.