Funktionen der Basisklasse automatisch ausführen



  • Hallo.

    Angenommen ich habe eine Klasse A mit der Funktion init (hier werden alle Attribute der Klasse A initialisiert).
    Ich leite die Klasse B von A ab.
    B erhält ebenfalls eine Funktion init, welche A::init() ausführen und danach noch weitere Attribute, welche es nur in B gibt, initialisieren soll.

    A::init();
    wäre hierfür die Lösung, dazu hätte ich aber eine Frage:

    Ist es möglich, dass das automatisiert wird? Kann ich init() von A mit einem Keyword versehen, so dass sie automatisch gecalled wird, wenn eine gleichnamige Funktion in einer abgeleiteten Klasse ausgeführt wird?

    Ähnlich ist es ja bei Kontruktoren, hier wird auch der der Basisklasse automatisch gecalled (und ja, das ist ein Sonderfall, ich weiß 😞 )

    Danke, für Eure Hilfe.

    LG, Steve


  • Mod

    Du weißt doch schon von Konstruktoren, warum also init-Methoden?

    Ist es möglich, dass das automatisiert wird? Kann ich init() von A mit einem Keyword versehen, so dass sie automatisch gecalled wird, wenn eine gleichnamige Funktion in einer abgeleiteten Klasse ausgeführt wird?

    Nein. Ruf die Methode aus A in den Methoden von B auf.



  • Die init Methode ist scheinbar ein schlechtes Beispiel.
    Die Frage ist aber auch bei einer Funktion wie act die gleiche.

    Aber:

    Ist es möglich, dass das automatisiert wird? Kann ich init() von A mit einem Keyword versehen, so dass sie automatisch gecalled wird, wenn eine gleichnamige Funktion in einer abgeleiteten Klasse ausgeführt wird?

    Nein. Ruf die Methode aus A in den Methoden von B auf.

    Schade, aber danke SeppJ.


  • Mod

    Man kann solch ähnliches Verhalten über virtuelle Funktionen herbeiführen. Das ist vermutlich eine gute Lösung für dein Problem, wenn du dieses einmal schildern würdest (Das was du machen willst, nicht das wie).



  • Okay:

    Ich habe eine Basisklasse entity, diese hat die Funktion move in der ein paar Checks ausgeführt werden, die für meine Bewegung wichtig sind.

    In der davon abgeleiteten Klasse player gibt es dann auch ein move, in der die Checks der Basisklasse gemacht werden sollen, ohne dass der Programmierer an Entity::move() denken muss.



  • NVI-Idiom evtl?


  • Mod

    mh... schrieb:

    NVI-Idiom evtl?

    Genau. Während ich ein Beispiel dafür schrieb, hast du schon geantwortet. Hier das Beispiel:

    #include <iostream>
    
    using namespace std;
    
    class Base 
    {
    public:
      void move()  { 
        cout<<"Tests in Basisklasse."<<endl;
        move_impl();
      }
      virtual ~Base() {}  
    private:
      virtual void move_impl() = 0;
    };
    
    class Derived : public Base
    {
    private:
      virtual void move_impl ()
      {
        cout<<"Move in abgeleiteter Klasse"<<endl;
      }
    };
    
    int main()
    {
      Derived d;
      d.move();
    }
    

    @Steve27: Zwecks Googeln: NVI-Idiom steht für Non-Virtual Interface Idiom



  • Perfekt, schlaue Lösung. Danke euch beiden!


Anmelden zum Antworten