struct Interface
{
virtual void foo() = 0;
virtual ~Interface() {}
};
class Implementation
{
struct InterfaceImpl : Interface
{
InterfaceImpl(Implementation* impl)
: impl_(impl) {}
virtual void foo() { impl_->doFoo(); }
Implementation* impl_;
};
public:
Implementation()
: interfaceImpl_(this) {}
Interface* getInterface() { return &interfaceImpl_; }
private:
InterfaceImpl interfaceImpl_;
void doFoo() {}
};
int main() {
Implementation impl;
return 0;
}
CnN0cnVjdCBJbnRlcmZhY2UKewoJdmlydHVhbCB2b2lkIGZvbygpID0gMDsKICAgIHZpcnR1YWwgfkludGVyZmFjZSgpIHt9Cn07CgpjbGFzcyBJbXBsZW1lbnRhdGlvbgp7CglzdHJ1Y3QgSW50ZXJmYWNlSW1wbCA6IEludGVyZmFjZQoJewoJCUludGVyZmFjZUltcGwoSW1wbGVtZW50YXRpb24qIGltcGwpCgkJOiBpbXBsXyhpbXBsKSB7fQoJCXZpcnR1YWwgdm9pZCBmb28oKSB7IGltcGxfLT5kb0ZvbygpOyB9CgkJCgkJSW1wbGVtZW50YXRpb24qIGltcGxfOwoJfTsKCQpwdWJsaWM6CiAgICBJbXBsZW1lbnRhdGlvbigpCiAgICA6IGludGVyZmFjZUltcGxfKHRoaXMpIHt9CiAgICAKICAgIEludGVyZmFjZSogZ2V0SW50ZXJmYWNlKCkgeyByZXR1cm4gJmludGVyZmFjZUltcGxfOyB9CiAgICAKcHJpdmF0ZToKICAgIEludGVyZmFjZUltcGwgaW50ZXJmYWNlSW1wbF87CiAgICAKICAgIHZvaWQgZG9Gb28oKSB7fQp9OwoKaW50IG1haW4oKSB7CglJbXBsZW1lbnRhdGlvbiBpbXBsOwoJCglyZXR1cm4gMDsKfQ==