abstrakte Klasse



  • Hallo,

    Ich versuche gerade eine virtuelle Funktion in zwei Kinderklassen jeweils zu implementieren.

    
    
    class Punktbasic
    {
      public:
       int x = 2;
       int y = 0;
       virtual int bewegenVor();
       void ausgeben();
    
    };
    
    class Punktx : public Punktbasic
    {
      public:
       int x = 2;
       int bewegenVor();
       void ausgeben();
    
    };
    
    class Punkty : public Punktbasic
    {
      public:
       int y = 2;
       int bewegenVor();
       void ausgeben();
    
    };
    
    
    

    FILENAME.cpp

    int  Punktx::bewegenVor(){
       return x += 1;
    }
    
    void Punktx::ausgeben(){
    
        std::cout << "Punkt X ist jetzt : " << x << std::endl;
    }
    
    int  Punkty::bewegenVor(){
       return y += 1;
    }
    void Punkty::ausgeben(){
    
        std::cout << "Punkt Y ist jetzt : " << y << std::endl;
    }
    
    
    

    Ich will einfach die Punkte anzeigen und bewegen.
    Wenn ich jetzt die jeweiligen Objekte erzeuge und mit for anzeigen lasse
    bekomme ich einen

    Warnung: undefinierter Verweis auf »typeinfo for Punktbasic«
    

    Als ich nur Punktx hatte funktionierte es tadellos.

    Hat wer ein paar Worte? Auch wie ich evetuell die Redundanten ausmerzen kann?

    Danke
    Lou



  • Der gezeigte Code enthält keine abstrakte Klasse.



  • @manni66
    okay. Danke.
    Hast du vllt trotzden noch einen Rat für das eigentliche Problem?

    ICh dachte sobald eine virtuelle Funktion bei ist, ist es automatisch eine abstrakte Klasse, da ich ja dann von ihr kein Exemplar erzeugen kann...



  • @Lou-Cyphr3 sagte in abstrakte Klasse:

    ICh dachte sobald eine virtuelle Funktion bei ist, ist es automatisch eine abstrakte Klasse, da ich ja dann von ihr kein Exemplar erzeugen kann.

    Du kannst ein Exemplar davon erzeugen.

    Möglicherweis hast du einfach die Funktion nicht implementiert. Das ist schlicht ein Fehler.



  • @Lou-Cyphr3 sagte in abstrakte Klasse:

    ICh dachte sobald eine virtuelle Funktion bei ist, ist es automatisch eine abstrakte Klasse, da ich ja dann von ihr kein Exemplar erzeugen kann...

    virtual heisst nur dass du die Funktion überschreiben kannst. Wenn du eine abstrakte Basisklasse möchtest und/oder möchtest dass du die Funktion in der Basisklasse nicht definieren musst, dann musst du sie zusätzlich noch "pure" machen:

    class Foo {
    public:
        virtual void VirtualFunction(); // Macht die Klasse nicht abstrakt und muss noch irgendwo implementiert werden
        virtual void VirtualPureFunction() = 0; // Macht die Klasse abstrakt und muss nicht implementiert werden
    };
    

    Weiters frage ich mich warum du in der Basisklasse die Integers x und y hast, und dann in Punktx ein neues x dazumachst und in Punkty ein neues y. Zum Verständnis: Punktx hat jetzt drei Integers, Punktbasic::x, Punktbasic::y und Punktx::x (und analog mit Punkty).



  • @hustbaer

    Danke ! pure war das was ich vergessen habe. Aber schlicht die 0 reicht aus? kein keyword nix?

    Zu deiner Verständnisfrage : Das ist ein Schusselfehler. Ich hatte urprünglich nur die Klasse Punkt und habe mich danach entschieden, sie als Basisklasse zu nutzen und die Kinder ins Spiel zubringen und habe sie damit quasi zu kurz gedacht. Aber Danke für den Hinweis!



  • Um dir noch einen Tipp zu geben: nutze unbedingt das Schlüsselwort override, wenn du in einer erbenden Klasse eine Funktion virtuell überschreiben möchtest. Dann fällt es schon dem Compiler auf, falls es keine entsprechende mit virtual markierte Funktion der Basisklasse gibt.

    Siehe hier: https://en.cppreference.com/w/cpp/language/override

    Zu deiner anderen Frage: ja, = 0 reicht aus. Siehe auch: https://en.cppreference.com/w/cpp/language/abstract_class (mit vielen Beispielen!)



  • @wob

    Danke dafür!


Log in to reply