konstruktor in abstrakter klasse



  • hallo,

    ich habe eine klasse, von der ich eine abstrakte basisklasse ableiten will und von dieser ich wieder eine klasse ableiten will, die einen konstruktoraufruf hat. das ganze sieht ca. so aus:

    die basisklasse:

    class base {
    base(int i, int j);
    };
    

    ;

    #include "base.h" 
    base::base(int i, int j){}
    

    die abgeleitete abstrakte klasse:

    #include "base.h"
    class derivedAbstract : public base{...};
    

    die von der abstrakten klasse abgeleitete klasse:

    #include "derivedAbstract.h"
    class derived : public virtual MitarbeiterP {
    derived();
    };
    
    #include "derived.h"
    derived::derived(){...}
    

    das problem ist, dass der compiler einen konstruktor bei der abstrakten oberklasse verlangt. ok, hab ich 'derivedAbstract();' in die abstrakte klasse dazugeschrieben. nun zeigt er leider 'undefined reference to derivedAbstract::derivedAbstract()' an.

    meine frage wäre, wie könnte man denn den konstruktor der untersten ebene (derived) aufrufen, wenn man eine abstrakte oberklasse hat?



  • upps, das 'MitarbeiterP' bei der klasse derived soll natürlich das 'derivedAbstract' darstellen...



  • dafür gibts je den "editieren"-knopf, oden rechts, schau mal genauer hin 😉
    über die eigentliche fragestellung nachdenk 😕 [schon n bissl schwierig... kann ma evtl den originalcode in .hpp und .cpp unterteilt sehen? wäre imho leichter nachzuvollziehen, was du da machst 👍 ]



  • ja, der editier-knopf ist mir aus anderen foren durchaus geläufig, nur geht das halt schwer, wenn man nicht registriert ist 😉

    zur besseren visualisierung hab ich ein klassendiagramm hinzugefügt:
    http://img183.imageshack.us/img183/5823/inheritkk0.jpg

    das problem ist, dass ich in der untersten klasse einen konstruktor habe, mit dem ich das attribut mit einem wert initialisieren will, aber der compiler einen konstruktor für die abstrakte klasse verlangt. wenn ich allerdings einen konstruktor in die mittleren klasse hinzufüge meckert er eben mit dieser meldung 'undefined reference to...'.



  • wenn du abstract eine konstruktordeklaration hinzufügst:

    class abstract : public base
    {
      abstract();
    
    virtual void Do() = 0;
    int attribut;
    };
    dann musst du ihn auch definieren, zB mit
    [cpp]
    class abstract : public base 
    {
      abstract() { };
    
      int attr;
      virtual void Do() = 0;
    };
    

    Wenn ich dich richtig verstanden habe, möchtest du jetzt im Konstruktor von derived abstract::attr mit der initialisierungsliste setzen? Das geht meines wissens nicht, in der initialisierungsliste können nur direkte member (also keine geerbten) oder basisklassen initialisiert werden.
    du kannst attr im konstruktor dann etwas zuweisen.

    Du kannst aber auch abstract::abstract() ganz weg lassen und in derived gleich den konstruktor von base aufrufen, glaub ich.
    versuch mal



  • Man kann immer nur den Konstruktor der direkten Basisklasse in der Initialisierungsliste aufrufen und den der virtuellen Basisklasse(n).

    Dadurch ergeben sich zwei Möglichkeiten:

    a)

    struct abstract : base
    {
      abstract( int a, int b ) : base( a, b ) {}
    };
    
    struct derived : abstract
    {
      derived() : abstract( 1, 2 ) {}
    };
    

    b)

    struct abstract : public virtual base
    {
    };
    
    struct derived : abstract
    {
      derived() : base( 1, 2 ){}
    };
    

    [/cpp]


Anmelden zum Antworten