#include <iostream> 
#include <vector> 
using  namespace  std; 
 
class  Shape { 
    protected : 
        Shape( )  { }  // Having a protected constructor only allows you to 
                   // call it from the same or derived class 
    public : 
        virtual  void  func( ) = 0 ; 
} ; 
 
class  Circle :  public  Shape { 
    public : 
        Circle( )  {   } 
        void  func( )  {  cout  <<  "Hello from a Circle object"  <<  endl;  } 
} ; 
 
class  Square :  public  Shape { 
    public : 
        Square( )  {   } 
        void  func( )  {  cout  <<  "Hello from a Square object"  <<  endl;  } 
} ; 
 
int  main( )  { 
 
    std:: vector < Shape* >  shapes; 
    Circle c; 
    Square s; 
    shapes.push_back ( & c) ;  // Store the address of the object 
    shapes.push_back ( & s) ;  // Store the address of the object 
 
    // A call through a pointer to a virtul polymorphic class 
    // will make sure to call the appropriate function 
    Shape ea; 
    shapes[ 0 ] - > func( ) ;  // Hello from a circle object 
    shapes[ 1 ] - > func( ) ;  // Hello from a square object 
 
 
} 
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgU2hhcGUgewogICAgcHJvdGVjdGVkOgogICAgICAgIFNoYXBlKCkge30gLy8gSGF2aW5nIGEgcHJvdGVjdGVkIGNvbnN0cnVjdG9yIG9ubHkgYWxsb3dzIHlvdSB0bwogICAgICAgICAgICAgICAgICAgLy8gY2FsbCBpdCBmcm9tIHRoZSBzYW1lIG9yIGRlcml2ZWQgY2xhc3MKICAgIHB1YmxpYzoKICAgICAgICB2aXJ0dWFsIHZvaWQgZnVuYygpPTA7Cn07CgpjbGFzcyBDaXJjbGUgOiBwdWJsaWMgU2hhcGUgewogICAgcHVibGljOgogICAgICAgIENpcmNsZSgpIHsgIH0KICAgICAgICB2b2lkIGZ1bmMoKSB7IGNvdXQgPDwgIkhlbGxvIGZyb20gYSBDaXJjbGUgb2JqZWN0IiA8PCBlbmRsOyB9Cn07CgpjbGFzcyBTcXVhcmUgOiBwdWJsaWMgU2hhcGUgewogICAgcHVibGljOgogICAgICAgIFNxdWFyZSgpIHsgIH0KICAgICAgICB2b2lkIGZ1bmMoKSB7IGNvdXQgPDwgIkhlbGxvIGZyb20gYSBTcXVhcmUgb2JqZWN0IiA8PCBlbmRsOyB9Cn07CgppbnQgbWFpbigpIHsKIAogICAgc3RkOjp2ZWN0b3I8U2hhcGUqPiBzaGFwZXM7CiAgICBDaXJjbGUgYzsKICAgIFNxdWFyZSBzOwogICAgc2hhcGVzLnB1c2hfYmFjaygmYyk7IC8vIFN0b3JlIHRoZSBhZGRyZXNzIG9mIHRoZSBvYmplY3QKICAgIHNoYXBlcy5wdXNoX2JhY2soJnMpOyAvLyBTdG9yZSB0aGUgYWRkcmVzcyBvZiB0aGUgb2JqZWN0CiAgICAKICAgIC8vIEEgY2FsbCB0aHJvdWdoIGEgcG9pbnRlciB0byBhIHZpcnR1bCBwb2x5bW9ycGhpYyBjbGFzcwogICAgLy8gd2lsbCBtYWtlIHN1cmUgdG8gY2FsbCB0aGUgYXBwcm9wcmlhdGUgZnVuY3Rpb24KICAgIFNoYXBlIGVhOwogICAgc2hhcGVzWzBdLT5mdW5jKCk7IC8vIEhlbGxvIGZyb20gYSBjaXJjbGUgb2JqZWN0CiAgICBzaGFwZXNbMV0tPmZ1bmMoKTsgLy8gSGVsbG8gZnJvbSBhIHNxdWFyZSBvYmplY3QKICAgIAoKfQ==