Copy C'tor und operator= bei Veerbung .



  • Hallo Leute , ich habe da mal wieder eine Frage .
    Nehmen wir mal an ich habe eine Oberklasse:

    class Oberklasse
    {
    
    protected:
    	std::string name;				
    	float weight_in_kg;	
    
    public:
    	Oberklasse (const std::string name_);
    	Oberklasse ();
    	Oberklasse & operator= (const Oberklasse& other);
    	Oberklasse (const Oberklasse &other);
    	~Oberklasse () ;
    };
    

    Und meine Unterklasse :

    class Unterklasse : public Oberklasse{
    
    public:
    
    	Unterklasse (const std::string name_);
    	Unterklasse ();
    };
    

    Meine Frage :
    Meine Unterklasse besitz ja keine Variablen , keinen Copy C'tor und keinen = operator.
    Erzeuge ich jetzt in meiner main Objekte vom Typ Unterklasse und übergebe dem Konstruktor ein Objekt dieser Klasse wird der Copy C'tor der Oberklasse aufgerufen . Aber woher weiß mein Unterklassen Objekt dass es den Oberklassen Konstruktor aufzurufen hat .Sieht der von Compiler generierte Standard Copy Konstruktor der Unterklasse so aus :

    Unterklasse::UnterKlasse(const Unterklasse& other):Oberklasse(other);
    

    Beim Zuweisungsoperator ist dies genauso .
    Ich hab hier ja Operator für den Typ Unterklasse angegeben.
    Trotzdem weiß mein Programm bei der folgenden Anweisung was es zu tun hat .

    Unterklasse A;
    Unterklasse B;
    A=B;
    

    Es ruft den Operator aus der Oberklasse auf .
    Erbt meine Unterklasse den =operator ?
    Dieser würde doch aber ein Objekt von Typ der Oberklasse erwarten , warum ruft er diesen Operator dann trotzdem auf ?

    Ich hoffe ihr könnt ein paar Unklarheiten beseitigen . 😞

    Mfg



  • Stelle dir die Objekte deiner Unterklasse so vor, dass sie ein Objekt der Oberklasse als Member haben (genauer gesagt heißt es Subobjekt). Es ist durch die Vererbung ein spezielles Member, das ändert bei normaler (nichtvirtueller) Vererbung aber nichts am Verhalten.

    Der automatisch generierte Copy-Ctor arbeitet so, dass er alle Member und Basisklassen-Subobjekte des neu zu konstruierenden Objektes mit dem entsprechenden Teil der Vorlage initialisiert:

    class SomeClass : public Base1, public Base2
    {
      int i;
      float f;
      SomeOtherClass someMember;
    
      /* generiert: */
      SomeClass(SomeClass const& other) : 
        Base1(other), //slicing auf Base1
        Base2(other), //slicing auf Base2
        i(other.i),
        f(other.f),
        someMember(other.someMember)
      {}
    };
    

    es wird also eine Elementweise Kopie angelegt. Der op= arbeitet genauso - für alle Member wird einzeln op= aufgerufen, also auch hier wieder eine Elementweise Kopie.



  • Heißt das jetzt dass jede meiner Membervariablen den = operator unterstützen muss.
    Und ich wenn ich keinen = operator implementiere trotzdem vom compiler einen generiert bekomme , der wiederrum die operatoren für alle Member aufruft ?
    Denn in meinem Code Beipspiel hat ja nur die Oberklasse den = operator definiert .



  • Bacid90210 schrieb:

    Und ich wenn ich keinen = operator implementiere trotzdem vom compiler einen generiert bekomme , der wiederrum die operatoren für alle Member aufruft ?

    Ja.

    Bacid90210 schrieb:

    Denn in meinem Code Beipspiel hat ja nur die Oberklasse den = operator definiert

    Unterklasse hat auch einen Unterklasse::operator=(Unterklasse const&) der automatisch vom Compiler generiert wird. operator= gehört zu den "special member functions", welche automatisch generiert werden können.


Anmelden zum Antworten