Frage zu Virtual!!
-
hey leute kann mir mal jemand erklären was virtualle funktionen sind??
wer dick wenn ein bsp dabei wäre!!
-
-
-
Bei virtuellen Funktionen wird erst zur Laufzeit entschieden, welche Version angewendet wird:
class base { public: void nfunc() {cout<<"base - nonvirtual"<<endl;} virtual void vfunc() {cout<<"base - virtual"<<endl;} }; class derived : public base { public: void nfunc() {cout<<"derived - nonvirtual"<<endl;} virtual void vfunc() {cout<<"derived - virtual"<<endl;} }; void test(base&obj) { obj.nfunc(); obj.vfunc(); } int main() { base bob; test(bob); /*Ausgabe: base - nonvirtual base - virtual */ derived dob; test(dob); /*Ausgabe: base - nonvirtual derived - virtual */ }(bei der nicht-virtuellen Funktion wird zur Compile-Zeit festgestellt, daß sie auf ein base-Objekt angewendet werden soll - also ruft das Programm die base-Version auf, bei der virtuellen Funktion stellt das Programm zur Laufzeit fest, daß es hier ein derived-Objekt hat und ruft dessen Version auf)
-
mal das abgedroschene Beispiel mit den Säugetieren:
class mammal { public: virtual void speak() {cout<<"Säuger sprechen ned"<<endl;} } class cat: public mammal { public: viod speak() {cout<<"miau"<<endl;} } int main() { // Katze erzeugen und sprechen lassen // -> kein Problem cat pussy; pussy.speak(); // das ganze mit Zeigern: // auch kein Problem cat * pussyPtr = new cat; pussyPtr->speak(); // und mit Säugetieren genauso: mammal * mamPtr = new mammal; mamPtr->speak(); // aber: eine Katze ist ein Säugetier, // daher geht auch sowas: // (einem Zeiger auf mammal wird ein Zeiger auf eine Katze zugewiesen!!!) mammal * mammalCat = new cat; // Preisfrage: was passiert jetzt? mammalCat->speak(); // Auflösung erster Teil: // der Compiler sieht, dass mammalCat vom Typ "mammal" ist. // Daher ruft er natürlich die speak()-Methode von mammal auf. // zweiter Teil: // dadurch, dass speak() in mammal "virtuel" ist, legt der Compiler // eine Tabelle an, in der drinnen steht, dass nicht das speak() von // mammal aufgerufen werden soll, sondern das von cat, sofern vorhanden. // => 'virtual' erzeugt das Verhalten, das man eigentlich erwartet, da // die Methode der abgeleiteten Klasse aufgerufen wird. // Allerdings ist das ganze nicht kostenlos, sondern dauert einen Tick länger, // da bei jedem Aufruf einer virtuellen Funktion erst die Tabelle durchsucht // werden muss, ob eine entsprechende Funktion in der abgeleiteten Klasse // vorhanden ist. return 0; }
-
Danke leute habs jetzt gepeilt!!!
aber ich frag mich warum postet akari den geleichen link wie GPC???
-
Hallo
weil ich die selbe Idee hatte wie GPC, nur zu langsam war.
bis bald
akari