Abstrakte Klassen



  • Hallo,

    könnt ihr mir sagen warum mein Compiler bei folgendem Code einen Fehler bringt?

    ISO C++ forbids declaration of Hund' with no type baseTier' with only non-default constructor in class without a constructor
    In member function `int Hunde::Hund(const std::string&, const std::string&)':
    cpp only constructors take base initializers

    #include <iostream>
    #include <string>
    using namespace std;
    
    class Tier
    {
        protected:
            string tierAttr;
    
        public:
            Tier(const string &tAttr) : tierAttr(tAttr) {}
    
            virtual void identifizieren()
            {
                cout << "Ich bin ein " << tierAttr << "Tier";
            }
    
            virtual void geraeusch() = 0;
    };
    
    class Katze : public Tier
    {
        private:
            string katzenAttr;
    
        public:
            Katze(const string &tAttr, const string &kAttr)
            : Tier(tAttr), katzenAttr(kAttr) {}
    
            virtual void identifizieren()
            {
                Tier::identifizieren();
                cout << " und eine " << katzenAttr << " Katze." << endl;
            }  
    
            virtual void geraeusch()
            {
                cout << "Miau" << endl;
            }
    };
    
    class Hunde : public Tier
    {
        private:
            string hundeAttr;
    
        public:
            Hund(const string &tAttr, const string &hAttr)
            : Tier(tAttr), hundeAttr(hAttr) {}
    
            virtual void identifizieren()
            {
                cout << "Ich bin ein " << tierAttr << "Tier";
                cout << " und ein " << hundeAttr << " Hund." << endl;
            }
    
            virtual void geraeusch()
            {
                cout << "Wau, wau" << endl;
            }
    };
    


  • Ähm, keine ahnung, aber einmal haste Hunde und einma nur Hund geschrieben.



  • Mir ist der Begriff Polymorphismus nicht so ganz klar. Im Zusammenhang mit dem Programm oben würde ich gerne wissen ob dort Polymorphismus verwendet wird und falls ja wo. Eine kurze Erklärung dieses Begriffs wäre auch nicht schlecht.



  • Hi,

    du hast einen tippfehler. Das kann man mit eine bisschen überlegen aber auch aus der compilermeldung ersehen. Deine klasse heisst Hunde und deine methode die der ctor sein sollte nur Hund , ohne e. Der compiler weisst dich darauf hin dass nur construktoren initialisierungslisten haben. In deinem fall construierst du da das basisobject, deswegen baseinitializer. Ansonsten ist die fehlermeldung aber ähnlich. Naja wenn das also kein ctor ist dann muss da irgendwas faul sein. Also schreibweise überprüfen und schon weisst du es. Kurzum entweder klassennamen in Hund umändern oder ctor in Hunde umbenennen.



  • BTW: Man gibt Klassen üblicherweise Nomen in der Einzahl. Polymorphismus "einsetzen" könntest du jetzt so:

    Tier* einTier = new Hund(blub,blub);
    Tier* einAnderesTier = new Katze(blub,blub);
    
    einTier->geraeusch(); // wau wau
    einAnderesTier->geraeusch(); // miau
    

    Ohne Polymorphismus würde die geraeusch()-Methdoe von Tier aufgerufen werden (welche es nicht gibt - daher kannst du auch gar kein Objekt vom Typ Tier anlegen sondern nur vom Typ Hund/Katze)

    MfG SideWinder



  • Hi,

    und noch eine anmerkung. Darüber bin ich ab und zu mal gestolpert. SideWinder hat ja zeiger benutzt. Das hat auch einen grund weil polymorphismus(polymorphy ?) nur mit zeigern und referenzen funktioniert.



  • Eigentlich schon alles gesagt...
    Falls nicht, ein gutes Tut zu C++ ist:
    http://tutorial.schornboeck.net


Anmelden zum Antworten