#include <iostream>

struct base {
   base( ) {
      std::cout << "constructor base\n";
   }
   virtual ~base( ) {                     // importante que el destructor sea virtual si es que se intentará destruir un objeto derivado usando un apuntador del tipo base
      std::cout << "destructor base\n";
   }
};

struct miembro {
   miembro( ) {
      std::cout << "constructor miembro\n";
   }
   ~miembro( ) {
      std::cout << "destructor miembro\n";
   }
};

struct derivado : base {
   miembro m;

   derivado( ) {
      std::cout << "constructor derivado\n";
   }
   ~derivado( ) {
      std::cout << "destructor derivado\n";
   }
};

int main( ) {
   base* p = new derivado( );
   delete p;
}
