- #include <iostream> 
- using namespace std; 
-   
- // Shape is abstract class: some methods are already available, some are not 
- class Shape 
- { 
- public: 
- // This is already implemented and ready for polymorphism 
- virtual void area() { cout<<"Shape area"<<endl;} 
- // You MUST implement this 
- virtual void implement_me() = 0; 
- }; 
-   
- class Circle : public Shape 
- { 
- public: 
- virtual void area() { cout<<"Circle area"<<endl;} 
- void implement_me() { cout<<"I implemented it just because I had to"<<endl;} 
- }; 
-   
- class HalfCircle : public Circle 
- { 
- public: 
- virtual void area() { cout<<"HalfCircle area"<<endl;} 
- }; 
-   
-   
- // ShapeInterface is a pure class or interface: everything must be implemented! 
- class ShapeInterface 
- { 
- public: 
- virtual void area() = 0; 
- }; 
-   
- class CircleFromInterface : public ShapeInterface 
- { 
- public: 
- // You MUST implement this! 
- virtual void area() { cout<<"CircleFromInterface area from interface"<<endl;}; 
- }; 
-   
-   
-   
- int main() { 
-   
- 	Shape* ptr_to_base = new HalfCircle(); 
- 	ptr_to_base->area(); // HalfCircle area, polymorphism 
- 	ptr_to_base->Shape::area(); // Shape area 
- 	ptr_to_base->implement_me(); // from Circle 
-   
-   
- 	ShapeInterface *ptr_to_base_int = new CircleFromInterface(); 
- 	ptr_to_base_int->area(); // Just the derived has it 
-   
- 	return 0; 
-   
-   
- }