#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==
compilation info
prog.cpp: In function ‘int main()’:
prog.cpp:7:9: error: ‘Shape::Shape()’ is protected
Shape() {} // Having a protected constructor only allows you to
^
prog.cpp:35:11: error: within this context
Shape ea;
^
prog.cpp:35:11: error: cannot declare variable ‘ea’ to be of abstract type ‘Shape’
prog.cpp:5:7: note: because the following virtual functions are pure within ‘Shape’:
class Shape {
^
prog.cpp:10:22: note: virtual void Shape::func()
virtual void func()=0;
^
stdout