Frage zu default parameter in Konstruktoren bei vererbung?



  • class A{
     int m_i;
    
    A(int i=0) : m_i(i){}
    
    };
    
    class B: public A{
    
     B(int i=0) : A(i){}
    
    };
    

    in dem Beispiel könnte ich ja bei klasse A (das i=0) weglassen wenn sie Abstraktir wäre.. wenn es nich so wäre muss ich es wie im beispiel machen oder? gibts andere möglichkeiten?



  • Du brauchst in dem Fall den Konstruktor A in der Initialisationsliste von B nicht aufrufen. Ansonsten versteh ich nich was du gern anders hättest. Du musst m_i natürlich nicht initialisieren, aber ob das so viel Sinn macht sei mal dahin gestellt.



  • wenn ich aber eine instanz B erzeuge mit einem wert für i.. kann ich A ja nich in der initialissieungsliste weg lassen!?



  • Doch, nur wird dann halt A( int ) mit dem Defaultwert für i aufgerufen! 😉



  • d.h. m_i ist immer 0 wenn ich instanzen B obj(n!=0); erzeuge?



  • Nur wenn du A( i ) aus der Initialisationsliste streichst. Dann wird der Standardkonstruktor aufgerufen, in dem Fall dein A( i = 0 ) (wegen dem default Parameter).



  • ok ich meinte halt das bei so einer klassenstruktur nötig ist für A und B den default wert anzugeben!?



  • Nein, ist nicht notwendig. Du schlägst dadurch nur zwei Fliegen mit einer Klappe (muss nicht unbedingt Sinnvoll sein), weil deine Konstruktoren B( int ) gleichzeitig Standardkonstruktoren sind.



  • Wenn du jetzt immer nur Tochterklassen von A benutzt, die immer den Konstruktor von A explizit aufrufen, genau dann ist der default Wert fuer A(i = 0) ueberfluessig, da er ja nie benutzt wird. Solltest du ihn aber weglassen, dann solltest du den Konstruktor von A immer aufrufen, sowohl bei abgeleiteten Klassen als auch wenn du Instanzen der Klasse A direkt verwendest. Denn andernfalls wird dann der vom Compiler generierte default-Konstruktor verwendet, der m_i uninitilaisiert laesst. Und das kann spaeter zu (vermeintlich) wunderlichem Verhalten fuehren, wenn m_i ploetlzlich "voellig unmotiviert" Zufallswerte in meist astronomischer Hoehe annimmt.



  • pumuckl schrieb:

    Denn andernfalls wird dann der vom Compiler generierte default-Konstruktor verwendet, der m_i uninitilaisiert laesst. Und das kann spaeter zu (vermeintlich) wunderlichem Verhalten fuehren, wenn m_i ploetlzlich "voellig unmotiviert" Zufallswerte in meist astronomischer Hoehe annimmt.

    Um die Dramatik dieser Ausführungen etwas zu reduzieren - der Compiler generiert nur dann einen eigenen Default-Ctor, wenn die Klasse gar keinen selbsgschriebenen Ctor hat. Das bedeutet, wenn du den Default-Parameter auslässt, gibt es keinen Default-Ctor und du mußt beim Anlegen eines A-Objektes IMMER einen Parameter mitgeben.



  • Oops. Okay, dann kriegst du bei Nichtverwendung des Konstruktors ohne Defaultparameter schon zur Compile-Zeit eine Fehlermeldung 😉

    Du kannst natuerlich den default-Parameter weglassen und einen Default-Konstruktor liefern, in dem du dann m_i initialisierst (vermutlich mit 0). Aber das haette den gleichen Effekt wie der implizite default-Konstruktor, den du durch den default-Parameter geschaffen hast. Beides zu liefern waere uebrigens auch bestenfalls sinnlos; ich bin mir nicht ganz sicher ob der Compiler einfach den echten default Konstruktor bevorzugt (womit der default Parameter obsolet waere) oder ob du bei der Verwendung einen Fehler wegen der Zweideutigkeit bekommst (ich vermute letzteres).


Anmelden zum Antworten