#include <iostream>
#include <vector>
#include <memory>
using namespace std;
class Shape {
public :
virtual void draw( ) { cout << "Not implemented yet, but making it abstract wouldn't compile" << endl; }
virtual ~Shape( ) { } ;
} ;
class Rectangle : public Shape {
public :
void draw( ) override { cout << "Rectangle" << endl; }
} ;
class Circle : public Shape {
public :
void draw( ) override { cout << "Circle" << endl; }
} ;
int main( ) {
cout << "Demo of slicing:" << endl;
vector< Shape> vs; // no pointers, slicing
vs.emplace_back ( Rectangle( ) ) ;
vs.emplace_back ( Circle( ) ) ;
vs.emplace_back ( Rectangle( ) ) ;
for ( auto & x: vs) x.draw ( ) ;
cout << endl<< "Demo of polymorphism:" << endl;
vector< shared_ptr< Shape>> vp; // polymorhpic container
vp.emplace_back ( make_shared< Rectangle> ( ) ) ;
vp.emplace_back ( make_shared< Circle> ( ) ) ;
vp.emplace_back ( make_shared< Rectangle> ( ) ) ;
for ( auto & x: vp) x- > draw( ) ;
// no worry about leaking: shared_ptr will destroy objects when no longer needed
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgU2hhcGUgewpwdWJsaWM6Cgl2aXJ0dWFsIHZvaWQgZHJhdygpIHsgY291dDw8Ik5vdCBpbXBsZW1lbnRlZCB5ZXQsIGJ1dCBtYWtpbmcgaXQgYWJzdHJhY3Qgd291bGRuJ3QgY29tcGlsZSI8PGVuZGw7fQoJdmlydHVhbCB+U2hhcGUoKSB7fTsgCn07CmNsYXNzIFJlY3RhbmdsZSA6IHB1YmxpYyBTaGFwZSB7CnB1YmxpYzoKCXZvaWQgZHJhdygpIG92ZXJyaWRlIHsgY291dDw8IlJlY3RhbmdsZSI8PGVuZGw7fQp9OwpjbGFzcyBDaXJjbGUgOiBwdWJsaWMgU2hhcGUgewpwdWJsaWM6Cgl2b2lkIGRyYXcoKSBvdmVycmlkZSB7IGNvdXQ8PCJDaXJjbGUiPDxlbmRsO30KfTsKCmludCBtYWluKCkgewoJY291dCA8PCAiRGVtbyBvZiBzbGljaW5nOiI8PGVuZGw7Cgl2ZWN0b3I8U2hhcGU+IHZzOyAgIC8vIG5vIHBvaW50ZXJzLCBzbGljaW5nCgl2cy5lbXBsYWNlX2JhY2soUmVjdGFuZ2xlKCkpOyAKCXZzLmVtcGxhY2VfYmFjayhDaXJjbGUoKSk7CQoJdnMuZW1wbGFjZV9iYWNrKFJlY3RhbmdsZSgpKTsgCglmb3IgKGF1dG8mIHg6dnMpIHguZHJhdygpOyAKCQoJY291dCA8PCBlbmRsPDwiRGVtbyBvZiBwb2x5bW9ycGhpc206Ijw8ZW5kbDsKCXZlY3RvcjxzaGFyZWRfcHRyPFNoYXBlPj4gdnA7ICAgLy8gcG9seW1vcmhwaWMgY29udGFpbmVyCgl2cC5lbXBsYWNlX2JhY2sobWFrZV9zaGFyZWQ8UmVjdGFuZ2xlPigpKTsgCgl2cC5lbXBsYWNlX2JhY2sobWFrZV9zaGFyZWQ8Q2lyY2xlPigpKTsJCgl2cC5lbXBsYWNlX2JhY2sobWFrZV9zaGFyZWQ8UmVjdGFuZ2xlPigpKTsgCglmb3IgKGF1dG8mIHg6dnApIHgtPmRyYXcoKTsgCgkvLyBubyB3b3JyeSBhYm91dCBsZWFraW5nOiBzaGFyZWRfcHRyIHdpbGwgZGVzdHJveSBvYmplY3RzIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZAoKCXJldHVybiAwOwp9