#include <iostream>
using std::cout;
using std::endl;

struct Base
{
    virtual void f(int)   { cout << "Base::f(int)"    << endl; }
    virtual void f(double){ cout << "Base::f(double)" << endl; }
};
struct Derived : public virtual Base
{
    using Base::f;
    virtual void f(int)   { cout << "Derived::f(int)" << endl; }
};

int main()
{
    Base b;
    Derived d;
    Base *pb = new Derived;
    Base &dr (d);

    b.f(1.0);
    d.f(1.0);
    pb->f(1.0);
    dr.f(1.0);

    delete pb;
}
