Virtuelle Vererbung



  • Hallo,

    ich komme gerade nicht mit der virtuellen Vererbung zurrecht 😞

    Ich hab hier dieses Allgemeine Beispiel mit Fahrzeug,Wasserfahrzeug,Landfahrzeug,Amphibienfahrzeug
    Meine 4 Klassen sind immer gleich aufgebaut
    Bsp. Landfahrzeug.h

    class Landfahrzeug:public virtual fahrzeug
    {
    	private:
    	public:
    		Landfahrzeug();
    		~Landfahrzeug();
    
    };
    
    Landfahrzeug::Landfahrzeug()
    {
    	cout<<"Default-Landfahrzeug"<<endl;
    
    }
    

    AmphibienFahrzeug.h

    class Amphiebienfahrzeug:public Landfahrzeug,public Wasserfahrzeug
    {
    	private:
    	public:
    		Amphiebienfahrzeug();
    		~Amphiebienfahrzeug();
    
    };
    
    Amphiebienfahrzeug::Amphiebienfahrzeug()
    {
    	cout<<"Default-Amphiebienfahrzeug"<<endl;
    
    }
    

    Die anderen beiden Klassen sind genauso aufgebaut(Fahrzeug,Wasserfahrzeug).
    Nun meine Main wo ich für jede Klasse ein Objekt erstelle

    Main.cpp

    int main()
    {
    	cout << "Ein fahrzeug:\n";
      fahrzeug f;
      cout << "Ein landfahrzeug:\n";
      Landfahrzeug lf;
      cout<<"Ein Wasserfahrzug:\n";
      Wasserfahrzeug wf;
      cout << "Ein amphibienfahrzeug:\n";
      Amphiebienfahrzeug af;
    
      system("pause");
      cin.get();cin.get();
    }
    

    Als Fehlermeldung bringt er mir sowas wie
    Bsp.
    Wasserfahrzeug: Basisklasse undefiniert
    fahrzeug: Basisklasse undefiniert
    Landfahrzeug: Basisklasse undefiniert
    Was mache ich falsch steh echt gerade auf dem Schlauch

    Eine Frage noch, für was steht #pragma once im oberen Bereich der Datei?

    Danke für Antworten

    VG Moritz



  • Du musst in deinem Amphibienfahrzeug-Konstruktor die anderen Konstruktoren aufrufen:
    - erst den der virtuellen Klasse (das machst du hier direkt aus dem Amphibienfahrzeug!)
    - dann die der nicht-virtuellen Basisklassen.

    #pragma once ist sowas wie ein Include-Guard. Eine Suche nach "#pragma once vs include guards" sollte dir alle Pros und Cons liefern.



  • Danke für die Antwort,

    Ich kann doch meinen Default-Konstruktor garnicht aufrufen, der ruft sich doch von selber auf ?



  • Ich verstehe deine Antwort nicht. Warum kannst du den default-Konstruktor nicht aufrufen?

    Amphibienfahrzeug::Amphibienfahrzeug()
        : fahrzeug()
        , Landfahrzeug()
        , Wasserfahrzeug()
    {
        ....
    }
    

    PS: Warum ist dein fahrzeug eigentlich klein, wo alle anderen Klassen mit Großbuchstaben anfangen?



  • Moritz Vogt schrieb:

    Als Fehlermeldung bringt er mir sowas wie

    Was hat dich jetzt daran gehindert, die Meldung einfach zu kopieren?

    Du musst natürlich auch ein include der Basisklassenheader einfügen, damit die Basisklassen bekannt sind.



  • wob schrieb:

    Du musst in deinem Amphibienfahrzeug-Konstruktor die anderen Konstruktoren aufrufen

    Nein



  • Ok, Manni66 hat recht. Aber sobald du deinem Basis-Konstruktor einen Parameter gibst, musst du das tun, was ich geschrieben hatte.

    Wenn das wirklich der echte Code ist, den du gezeigt hast, dann verwundert auch noch, dass du im Header cout/endl verwendest, also vermutlich irgendwo den namespace std includest. Das tut man in Header-Dateien nicht. (das sieht man aber nirgends im geposteten Code - es muss also jedenfalls noch irgendwas fehlen, daher war ich selbstverständlich davon ausgegangen, dass du nicht alles komplett zeigst und dass du auch korrekt includest).

    Genaue Fehlermeldungen helfen. Immer.



  • wob schrieb:

    PS: Warum ist dein fahrzeug eigentlich klein, wo alle anderen Klassen mit Großbuchstaben anfangen?

    Das ist nichts als konsequent, denn fahrzeug ist bei allen vier Klassen klein geschrieben... 🤡


Anmelden zum Antworten