Vererbung von Einzelnen Methoden?



  • Wenn du nicht die gesamte Klasse erben willst, ist Vererbung ein Designfehler.

    Was hindert dich daran, die Methode what() selbst zu definieren und std::exception::what() darin aufzurufen bzw. die komplette Klasse std::exception zu erben?



  • Michael E. schrieb:

    Wenn du nicht die gesamte Klasse erben willst, ist Vererbung ein Designfehler.

    Was hindert dich daran, die Methode what() selbst zu definieren und std::exception::what() darin aufzurufen bzw. die komplette Klasse std::exception zu erben?

    Genau das meinte ich, wie bringe ich "mein" what dazu die andere Methode aufzurufen? Kannst du das kurz in nen Syntax Beispiel aufzeigen?



  • class eCnull_division
    {
    public:
        const char * const what()
        {
            return std::exception().what();
        }
    };
    

    ^^

    Erklär mir mal bitte, warum eCnull_division nicht von std::exception erben soll.



  • weil ich nur What von der Klasse brauche und sonst nichts?;)

    Dachte es wäre vllt Leistungssparender nur bestimmte Teile einer Klasse abzuleiten anstatt alles.



  • Nein, das ist ein irrglaube. Sobald du erbst, hast du eine vtable. "Wenig" vererben gibt es technisch nicht. Außerdem sollte man meistens Design vor Technik stellen. Wenn deine eCnull_division eine exception ist, solltest du davon erben - basta. Sonst kannste OO gleich vergessen.



  • Artchi schrieb:

    Sobald du erbst, hast du eine vtable.

    Echt? Ich behaupte das ist nicht so.

    Btw gibts nichts sonst zu erben, die g++-lib sieht so aus:

    namespace std
    {
      /**
       *  @brief Base class for all library exceptions.
       *
       *  This is the base class for all exceptions thrown by the standard
       *  library, and by certain language expressions.  You are free to derive
       *  your own %exception classes, or use a different hierarchy, or to
       *  throw non-class data (e.g., fundamental types).
       */
      class exception
      {
      public:
        exception() throw() { }
        virtual ~exception() throw();
        /** Returns a C-style character string describing the general cause
         *  of the current error.  */
        virtual const char* what() const throw();
      };
    ...
    

    Was die MS Implementierung fuern Schrott da reinpackt kann ich dir nicht sagen. Ist mir irgendwie unverstaendlich.



  • @Shilka: Was für eine Beziehung soll denn zwischen deiner Klasse und std::exception bestehen? Wenn das da oben eine Exception sein soll, ist Vererbung (und zwar der kompletten Klasse) der richtige Weg. Wenn deine Klasse "nur" eine Methode namens what() benötigt, kannst du sie auch selber schreiben.

    Artchi schrieb:

    Sobald du erbst, hast du eine vtable.

    das ist imho falsch - eine vtable bekommst du nur, wenn du virtuelle Funktionen verwenden willst (oder von einer Klasse erbst, die virtuelle Funktionen verwendet).
    (und soviel Platz benötigt die vtable nun auch wieder nicht)



  • Und Vererbung ohne virtuelle Methode ist richtig? 😮



  • technisch gesehen ja (d.h. du darfst von jeder Klasse ableiten - du mußt nur wissen, ob es Sinn macht).

    (z.B. gibt's in der MFC einige Wrapper-Klassen, die von WinAPI (C-)Structs abgeleitet sind)




Anmelden zum Antworten