virtual Methode



  • #include <iostream>
    
    using namespace std;
    
    class instrument{
    
    public:
    
       void klingen()
      {
    
        cout<<"Instrumente haben einen Klang";
    
      }
    
    };
    
    class trompete:public instrument
    {
    
    public:
    
    void   klingen()
      {
           cout<< "die Trompete trompetet"; 
    
      }
    
    };
    
    void main(void)
    {
    
     trompete x;
    
     x.klingen();  //Ausgabe die Trompete trompetet
    
    }
    

    Wann braucht man denn das Schluesselwort "virtual"? Im Codebeispiel oben
    wird ja auch ohne virtual die Methode klingen der abgeleiteten Klasse ausgegeben ?

    Danke



  • Der Sinn von virtual ist es ohne das Instrument zu kennen die richtigen Töne zu spielen. 😉
    Sprich so etwas zu machen:

    void main(void)
    {
    
     trompete x;
     instrument* i = &x;
    
     x.klingen();  //Ausgabe die Trompete trompetet
     i->klingen (); // Ausgabe ebenfalls Trompete trompetet
    }
    

    Das ist ohne virtual nicht möglich. Aber eben mal ein virtual vor klingen in instrument und schonn klappt das so. Dabei solltest du nicht vergessen den Destruktor der Basisklasse ebenfalls virtual zu machen, damit das zerstören der abgeleiteten Klasse durch eine Basisklasse möglich ist.



  • Besonders sinnvoll ist es, wenn du z.B. ein Array von Instrumenten hast:

    std::vector<instrument *> orchester;
    
    orchester.push_back(new trompete());
    orchester.push_back(new schlagzeug());
    orchester.push_back(new violine());
    
    for(std::vector<instrument *>::iterator it = orchester.begin(); it != orchester.end(); it++)
    {
      it->klingen();
    }
    

    Beachte: Polymorphie (d.h. die Verwendung von virtuellen Funktionen) klappt nur mittels Zeigern!



  • blurry33 schrieb:

    Wann braucht man denn das Schluesselwort "virtual"? Im Codebeispiel oben wird ja auch ohne virtual die Methode klingen der abgeleiteten Klasse ausgegeben ?

    In der Objektorientierung will man eigentlich beliebige Nachrichten an Objekte senden können. Wie die Objekte reagieren und ob sie überhaupt reagieren ist dann alleine deren Sache bzw. hängt von deren Konstruktion ab.

    D.h. wenn ich z.B. verschiedene Objekte "verbrennen" will interessiert mich nicht von was für einem Typ die Objekte genau sind. Ich will einfach eine Nachricht an das Objekt senden (z.B. so: meinObjekt.verbrenne() ) und das Objekt soll dann entsprechend reagieren.

    Leider ist das in dem streng typisierten c++ nicht möglich. Ich muss in c++ den Typ einer Variablen/eines Objekts immer angeben und wenn die Klasse des Objekts keine Methode verbrenne() definiert, dann ist der Aufruf meinObjekt.verbrenne() für dieses Objekt auch noch ein Fehler.

    Man kann daher bei c++ nicht wirklich von einer objektorientierten Programmiersprache sprechen.

    Virtuelle Funktionen sind der verkrüppelte Versuch dem Programmierer etwas von der obigen Funktionalität anzubieten.

    Indem du alle Klassen von derselben Basisklasse erben lässt ist gesichert, dass sie auch eine spezielle Methode anbieten (z.B. verbrenne()). Und indem man abgeleitete Objekte an Zeiger bzw. Referenzen der Basisklasse binden kann, umgeht man die strenge Typisierung und kann so verbrenne() zwar nicht auf beliebige Objekte aber immerhin auf Objekte mit derselben Basisklasse anwenden.

    P.S.: Täuschen mich meine trüben Augen, oder postet camper wieder?


Anmelden zum Antworten