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