# 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 ( ) ;
}