Polymorphie - Virtual



  • Hiho 🙂

    um direkt zu Sache zukommen 😃
    Ich habe folgenden Code:

    void main() {
      BMW* meinBMW = new dreierBMW;
    
      Auto* meinAuto = meinBMW;
    
      meinAuto->Fahren();
    }
    
    class Auto {
    
      public:  
      Auto() { }
      virtual void Fahren() { }
    }
    
    class BMW : Auto {
    
      public:
      BMW() {}
      void Fahren() {
    
        Beschleunigen();
      }
      virtual void Beschleunigen() { }
    }
    
    class dreierBMW() : BMW {
    
      public:
      dreierBMW() {}
      void Beschleunigen();
    }
    

    nun ich möchte die Funktion "Beschleunigen" der Klasse "dreierBMW" mit der Funktion "Fahren" ausführen 😃
    aber er führt die Funktion "Beschleunigen" der Klasse BMW aus 😕
    was mach ich falsch und was könnte ich tun damit es funktioniert ? 🙂

    mfg Trekarraz


  • Mod

    Schritt 1: Aus deinem Quellcode die vielen offensichtlichen Fehler rausmachen. D.h. fehlende Semikolons setzen, falsch gesetzte Klammern entfernen, public-Vererbung statt private, Reihenfolge korrigieren, usw.
    Schritt 2: Kontrollausgaben, an denen man überhaupt sieht, was passiert

    Ergebnis:

    #include <iostream>
    using std::cout;
    
    class Auto {
      public:  
      Auto() { }
      virtual void Fahren() {cout <<"Autofahren\n"; }
    };
    
    class BMW : public Auto {
    public:
      void Fahren() {
        cout << "BMW fahren\n";
        Beschleunigen();
      }
      virtual void Beschleunigen() { cout << "BMW beschleunigen\n";}
    };
    
    class dreierBMW: public BMW {
      public:
      dreierBMW() {}
      void Beschleunigen() {cout << "3er BMW beschleunigen\n";};
    };
    
    int main() {
      BMW* meinBMW = new dreierBMW;
    
      Auto* meinAuto = meinBMW;
    
      meinAuto->Fahren();
    }
    

    Doch oh Schreck! 😮 Der Code funktioniert:
    http://ideone.com/e79CEG

    Da hast du wohl
    http://www.c-plusplus.net/forum/304133
    nicht beachtet und es ist genau das passiert, weshalb dieser Beitrag als wichtig markiert ist.



  • ohh verdammt ... sry ...
    hab nen anderen Code gehabt der viel mehr Funktionen etc beeinhaltet und ich dachte lieber machst du ne einfache Version damit nicht alles zugeknallt wird ...
    und genau da hab ich alles richtig gecodet aka hab ein virtual im Original vergessen >_<



  • Trekarraz schrieb:

    void main() {
      BMW* meinBMW = new dreierBMW; // Schrott, Klasseninstanzen mit new zu erzeugen
      
      Auto* meinAuto = meinBMW; // Schrott, eine Oberklassen-Quasi-Instanz auf eine Unterklassen-Quasi-Instanz verweisen zu lassen
    

    aber er führt die Funktion "Beschleunigen" der Klasse BMW aus

    Weil die Methode dort definiert ist, deshalb führt "er" sie "dort" aus.


Anmelden zum Antworten