#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==