Vererbung noch aktuell?



  • Hallo,
    ich habe mal was davon gelesen dass immer mehr Leute von dem Thema der Vererbung in C++ abkommen und wenn dann nur gegen Schnittstellen programmieren. Ist da was dran?



  • Ja, OOP ist nicht zur zentralen Denkweise von C++ geworden.

    Aktuell scheint der Trend eher in richtung statischer polymorphie zu gehen, also eben Schnittstellen und eher generischem C++ mit Templates. Dies bekommt auch vorschub dadurch dass nun std::variant existiert. Damit kann man dann eine Basisklasse für das Verwalten von Instanzen in einem Container ersetzen.

    Statt A,B und C von Base abzuleiten, wird dann einfach ein std::variant<A,B,C> gebildet, das bestimmte Schnittstellen eingehalten werden kann man über Typetraits sicherstellen.



  • Danke, klingt ganz schon kompliziert. Mit Templates habe ich noch nie gearbeitet. Hast du ein kleines Minimal Beispiel?



  • Ich persönlich ruder vom "templates everywhere" etwas zurück, da ich in einem aktuellen "großen" Projekt Probleme mit den Übersetzungszeiten habe, die die Produktivität drücken. Pimpl muss ich dadurch (leider) sowieso hier und da einsetzen. (man überlegt es sich mehrmals, wenn komplette rebuilds mittlerweile 'ne Stunde dauern).

    Außerdem kriege ich eher Bauchschmerzen wenn ich std::variant aufgeführt kriege als Alternativoption. Für mich klingt das geradezu nach Obfuscation.
    Bei klaren "ist-ein" Beziehungen oder Hierarchien, also bei klarer probleminhärenter Struktur gibt es erstmal wenig Grund Vererbung aktiv zu vermeiden (selbst wenn besonders dann wenn man den Polymorphie Aspekt gar nicht benutzt).
    Natürlich kann man auch statische Polymorphie benutzen und das hat hauptsächlich Performance Vorteile.

    Hier mal ein plumpes Beispiel.

    struct Cat 
    { 
        void run(){} 
        void eat(){}
    };
    
    struct Dog
    { 
        void run(){} 
        void eat(){}
    };
    
    // T muss erfüllen, dass T "run" und "eat" kann. 
    // Polymorphie ohne Vererbung.
    template <typename T>
    void foo(T& animal)
    {
        animal.run();
        animal.eat();
    }
    


  • Ah super danke für das schön einfache Beispiel. Das sieht sehr elegant aus, auf so eine Idee wäre ich niemals gekommen. Ich hätte erst mal eine Abstrakte Klasse Animal erstellt, von der Dog und Cat erben müssten.


  • Gesperrt

    Ja, aber was wenn Dog(s) und Cat(s) in den gleichen std::vector (Container) müssen? Wie dann ohne Abstrakte Klasse? Macht das dann std::variant<Cat, Dog>?



  • @titan99_ sagte in Vererbung noch aktuell?:

    Macht das dann std::variant<Cat, Dog>?

    Ja.



  • Es gibt von Sean Parent ein schönes Video, das sich unter anderem mit diesem Thema befasst (No raw pointers).
    Video auf youtube
    Präsentation auf seiner Website


Anmelden zum Antworten