#include <iostream>
using namespace std;
class Base {
	public:
	virtual void tell()	{
		cout<<"Base"<<endl;
	}
	void tell_usual() {
		cout<<"Base"<<endl;
	}
};

class Derived : public Base {
	public:
	void tell() override {
		cout<<"Derived"<<endl;
	}
	void tell_usual() {
		cout<<"Derived"<<endl;
	}
};


int main() {
	Base * base = new Base();
	Derived * derived = new Derived();
	Base *derived_as_base = derived; //pay attention! ptr to Base!
	cout<<"Base::tell ";
	base->tell();
	cout<<"Base::tell_usual ";
	base->tell_usual();
	cout<<"Derived::tell ";
	derived->tell();
	cout<<"Derived::tell_usual ";
	derived->tell_usual();
	cout<<"(Base*)Derived::tell (POLYMORPH!) ";
	derived_as_base->tell();
	cout<<"(Base*)Derived::tell_usual ";
	derived_as_base->tell_usual();
	
	delete base;
	delete derived;
	return 0;
}