#include <iostream>

struct Base
{
    virtual void f(){ std::cout << "Base::f()" << std::endl; }
};
struct Derived
: Base
{
    virtual void f() override { std::cout << "Derived::f()" << std::endl; }
};

int main()
{
	Derived d;
	Base &b = d;
	
	d.f(); //calls Derived::f()
	b.f(); //calls Derived::f()
	d.Base::f(); //calls Base::f()
	b.Base::f(); //calls Base::f()
}
