#include <iostream>
#include <memory>
using namespace std;
struct Interface {
virtual void f () = 0;
virtual ~Interface() {};
};
struct SomeClass {
virtual void additionalBehaviour () = 0;
void g () {
additionalBehaviour ();
/*Some stuff with printing into a ostringstream*/
}
};
struct Derived : public SomeClass, public Interface {
void additionalBehaviour () override { cout<<"additional"<<endl; /*Some printing to oss*/ }
void f () override { g (); }
};
int main () {
unique_ptr<Interface> ifc (new Derived ());
ifc->f ();
cout << "HI!" << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IEludGVyZmFjZSB7CiAgICB2aXJ0dWFsIHZvaWQgZiAoKSA9IDA7CiAgICB2aXJ0dWFsIH5JbnRlcmZhY2UoKSB7fTsKfTsKCnN0cnVjdCBTb21lQ2xhc3MgewogICAgdmlydHVhbCB2b2lkIGFkZGl0aW9uYWxCZWhhdmlvdXIgKCkgPSAwOwogICAgdm9pZCBnICgpIHsKICAgICAgICBhZGRpdGlvbmFsQmVoYXZpb3VyICgpOwogICAgICAgIC8qU29tZSBzdHVmZiB3aXRoIHByaW50aW5nIGludG8gYSBvc3RyaW5nc3RyZWFtKi8KICAgIH0KfTsKCnN0cnVjdCBEZXJpdmVkIDogcHVibGljIFNvbWVDbGFzcywgcHVibGljIEludGVyZmFjZSB7CiAgICB2b2lkIGFkZGl0aW9uYWxCZWhhdmlvdXIgKCkgb3ZlcnJpZGUgeyBjb3V0PDwiYWRkaXRpb25hbCI8PGVuZGw7IC8qU29tZSBwcmludGluZyB0byBvc3MqLyB9CiAgICB2b2lkIGYgKCkgb3ZlcnJpZGUgeyBnICgpOyB9Cn07CgppbnQgbWFpbiAoKSB7CiAgICB1bmlxdWVfcHRyPEludGVyZmFjZT4gaWZjIChuZXcgRGVyaXZlZCAoKSk7CiAgICBpZmMtPmYgKCk7CiAgICBjb3V0IDw8ICJISSEiIDw8IGVuZGw7CiAgICByZXR1cm4gMDsKfQo=