inheritance composition



  • // based on Bruce Eckel's code
    #include <iostream>
    #include <conio.h>
    using namespace std;
    
    // Inheritance & composition
    
    class A 
    {
        int i;
      public:
        A(int ii) : i(ii) {cout << "ctor of A" << endl;}
        ~A() {cout << "dtor of A" << endl;}
        void f() const {}
    };
    
    class B 
    {
        int i;
      public:
        B(int ii) : i(ii) {cout << "ctor of B" << endl;}
        ~B() {cout << "dtor of B" << endl;}
        void f() const {}
    };
    
    class C : public B // inheritance 
    {
        A a; // composition
      public:
        C(int ii) : B(ii), a(ii) {cout << "ctor of C" << endl;}
        ~C() {cout << "dtor of C" << endl;} // Calls ~A() and ~B()
        void f() const // redefinition
        { 
          a.f();
          B::f();
        }
    };
    
    int main() 
    {
      {
        C c(47);
        getch();
      }    
      getch();
    }
    

    Warum wird eigentlich zuerst das Basisklassen-Subobjekt und dann erst die member konstruiert, beim dtor zuerst die member und dann die Basisiklasse?



  • weil die objekte in der umgekehrten reihenfolge ihrer erzeugung zerstört werden müssen.



  • warum wird zuerst basisklassen-subobject und dann erst member (composition) erzeugt, warum nicht umgekehrt?



  • ´ schrieb:

    warum wird zuerst basisklassen-subobject und dann erst member (composition) erzeugt, warum nicht umgekehrt?

    Der Standard schreibt es so vor. Es hat auch etwas mit dem Stack zutun: die Objekte die auf dem Stack angelegt wurden, werden ebefalls in der umgekehrten Reihenfolge ihrer Konstruktion zerstört.



  • Du musst nur nachdenken, was wann noch verwendet werden kann. Dann wirst du sehen, dass es so sein muss.


Anmelden zum Antworten