# include  <iostream> # include  <list> # include  <memory> class  Base  { 
public : 
    virtual  void  Process ( )  =  0 ; 
} ; 
class  DoThis  :  public  Base { 
public : 
    virtual  void  Process ( )  { 
        std:: cout <<  __FUNCTION__ <<  std:: endl; 
    } 
} ; 
class  DoThat  :  public  Base { 
public : 
    virtual  void  Process ( )  { 
        std:: cout <<  __FUNCTION__ <<  std:: endl; 
    } 
} ; 
class  Application  { 
public : 
    virtual  void  doWork ( )  { 
        std:: cout <<  "Application::doWork, and could do the hooks for other application"  <<  std:: endl; 
    } 
    virtual  void  ProcessItems ( std:: list< std:: shared_ptr< Base>  >  items) { 
    } 
    virtual  void  init ( )  { 
    } 
} ; 
class  MyApplication  :  public  Application { 
public : 
    virtual  void  doWork ( )  { 
        std:: cout <<  "MyApplication::doWork"  <<  std:: endl; 
        init ( ) ; 
    } 
    virtual  void  ProcessItems ( std:: list< std:: shared_ptr< Base>  >  items) { 
        for  ( const  auto &  item :  items) 
        { 
            item-> Process ( ) ; 
        } 
    } 
    virtual  void  init ( )  { 
        std:: list< std:: shared_ptr< Base>  >  items{ } ; 
        items. push_back ( std:: make_shared < DoThat> ( ) ) ; 
        items. push_back ( std:: make_shared < DoThis> ( ) ) ; 
        items. push_back ( std:: make_shared < DoThis> ( ) ) ; 
        items. push_back ( std:: make_shared < DoThat> ( ) ) ; 
        ProcessItems ( items) ; 
    } 
} ; 
int  main ( ) 
{ 
    std:: shared_ptr< Application>  app =  std:: make_shared < MyApplication> ( ) ; 
    app-> doWork ( ) ; 
}