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.