- //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