//g++  5.4.0

#include <iostream>
using namespace std;

class Interface
{
    public:
    virtual void sayHello() = 0;
    virtual void sayBye() = 0;
};

class Foo: public Interface
{
    public:
    Foo () { cout<< "Constr Foo\n"; }
    void sayHello() override {cout<< "Hello Foo\n"; } 
    void sayBye() override {cout<< "Bye Foo\n"; }
};

template <typename T>
class Proxy: public T
{
    public:
    void sayHello() { cout << "Proxy: "; T::sayHello(); } 
};

void use(Interface& inf)
{
    inf.sayHello();
    inf.sayBye();
}

int main()
{
    Proxy<Foo> p;
    use(p);
}