Frage zu Virtual!!



  • hey leute kann mir mal jemand erklären was virtualle funktionen sind??
    wer dick wenn ein bsp dabei wäre!!





  • Hallo

    Hier gibts ein eigenen Abschnitt darüber.

    bis bald
    akari



  • 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


Anmelden zum Antworten