Frage zu rein-virtuellen Methoden



  • Mal angenommen, ich habe folgende Klasse:

    class A
    {
    public:
        virtual void pure() = 0;
    };
    

    Dann muss ich pure in allen abgeleiteten Klassen (re)imlementieren.
    Wenn ich nun eine "zweite Basis Klasse" unter A erstellen moechte von dir ich Instanzen erlauben moechte, z.B.

    class B : public A
    {
    public:
        void pure() {}
    };
    

    muss ich pure zwar fuer B implementieren, aber nicht mehr fuer Kindklassen unter B:

    class C : public B
    {
    public:
        //void pure() {} nicht noetig
    };
    

    Wie kann ich die erneute Implementierung von pure() erzwingen und dennoch Instanzen von B erlauben?



  • Eric Cartman schrieb:

    Dann muss ich pure in allen abgeleiteten Klassen (re)imlementieren.

    Etwas unklar ausgedrückt. Du musst natürlich pure nicht in jeder Klasse implementieren, die von A erbt. Genauer gesagt: man darf von einer Klasse, die direkt oder indirekt von A erbt, nur dann ein Objekt erstellen, wenn die Klasse oder eine der Elternklassen (die direkt oder indirekt von A erben), pure implementiert. Reimplementieren musst du garnichts.

    Wie kann ich die erneute Implementierung von pure() erzwingen und dennoch Instanzen von B erlauben?

    Garnicht. Die ganz strengen Jünger der Objektorientierung machen sowieso alle Klassen, die als Basisklassen gedacht sind, pure virtual. In deinem Fall würde man dann eine Klasse BBase erstellen, die pure nicht implementiert und die zum ableiten gedacht ist, und eine Klasse B, die von BBase ableitet und pure implementiert.



  • Bitte auch bedenken: Je mehr Kontext du gibst, desdo größer ist die Wahrscheinlichkeit, dass irgendjemand hier dir eine Lösung zeigt, auf die du noch gar nicht gekommen bist.



  • pumuckl schrieb:

    Eric Cartman schrieb:

    Dann muss ich pure in allen abgeleiteten Klassen (re)imlementieren.

    Etwas unklar ausgedrückt. Du musst natürlich pure nicht in jeder Klasse implementieren, die von A erbt. Genauer gesagt: man darf von einer Klasse, die direkt oder indirekt von A erbt, nur dann ein Objekt erstellen, wenn die Klasse oder eine der Elternklassen (die direkt oder indirekt von A erben), pure implementiert. Reimplementieren musst du garnichts.

    Mit reimplementieren bezog ich mich auf den spezielleren Fall, dass man reinvirtuelle Methoden in der abstrakten Basisklasse auch implementieren darf, aber sie in der abgeleiteten Klasse trotzdem reimplementieren muss, wenn man Instanzen der abgeleiteten Klasse erlauben moechte.

    pumuckl schrieb:

    Wie kann ich die erneute Implementierung von pure() erzwingen und dennoch Instanzen von B erlauben?

    Garnicht. Die ganz strengen Jünger der Objektorientierung machen sowieso alle Klassen,
    die als Basisklassen gedacht sind, private.

    Verstehe nicht, was du damit meinst ...

    pumuckl schrieb:

    In deinem Fall würde man dann eine Klasse BBase erstellen, die pure nicht implementiert und die zum ableiten gedacht ist, und eine Klasse B, die von BBase ableitet und pure implementiert.

    Gute Loesung.
    Bleibt dann nur ein kleines Problem uebrig: Man darf trotzdem noch von B ableiten und kann dann damit das implementieren von pure umgehen, aber ja, damit kann ich leben.
    Danke.



  • Eric Cartman schrieb:

    pumuckl schrieb:

    Garnicht. Die ganz strengen Jünger der Objektorientierung machen sowieso alle Klassen,
    die als Basisklassen gedacht sind, private.

    Verstehe nicht, was du damit meinst ...

    Sorry, war wohl nicht ganz wach. Gemeint ist nicht private sondern abstrakt. Habs geändert.

    Eric Cartman schrieb:

    Bleibt dann nur ein kleines Problem uebrig: Man darf trotzdem noch von B ableiten

    Technisch gesehen ja. Aber gegen Bösartigkeit kann man sich nunmal nicht schützen 😉


Anmelden zum Antworten