//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);
}
Ly9nKysgIDUuNC4wCgojaW5jbHVkZSA8aW9zdHJlYW0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBJbnRlcmZhY2UKewogICAgcHVibGljOgogICAgdmlydHVhbCB2b2lkIHNheUhlbGxvKCkgPSAwOwogICAgdmlydHVhbCB2b2lkIHNheUJ5ZSgpID0gMDsKfTsKCmNsYXNzIEZvbzogcHVibGljIEludGVyZmFjZQp7CiAgICBwdWJsaWM6CiAgICBGb28gKCkgeyBjb3V0PDwgIkNvbnN0ciBGb29cbiI7IH0KICAgIHZvaWQgc2F5SGVsbG8oKSBvdmVycmlkZSB7Y291dDw8ICJIZWxsbyBGb29cbiI7IH0gCiAgICB2b2lkIHNheUJ5ZSgpIG92ZXJyaWRlIHtjb3V0PDwgIkJ5ZSBGb29cbiI7IH0KfTsKCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBQcm94eTogcHVibGljIFQKewogICAgcHVibGljOgogICAgdm9pZCBzYXlIZWxsbygpIHsgY291dCA8PCAiUHJveHk6ICI7IFQ6OnNheUhlbGxvKCk7IH0gCn07Cgp2b2lkIHVzZShJbnRlcmZhY2UmIGluZikKewogICAgaW5mLnNheUhlbGxvKCk7CiAgICBpbmYuc2F5QnllKCk7Cn0KCmludCBtYWluKCkKewogICAgUHJveHk8Rm9vPiBwOwogICAgdXNlKHApOwp9