#include <iostream>
#include <string>
#include <memory>
struct Other
{
virtual void print() = 0;
virtual ~Other() = default;
};
struct Base
{
Base(Other *o)
{
o->print();
}
virtual ~Base() = default;
};
struct Derived : Base
{
Derived();
virtual ~Derived();
private:
struct My;
std::unique_ptr<My> my;
};
int main()
{
Derived d;
}
struct Derived::My : Other
{
std::string s = "It works";
virtual void print()
{
std::cout << s << std::endl;
}
};
Derived::Derived()
: my(new My)
, Base(my.get())
{
}
Derived::~Derived() = default;
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8bWVtb3J5PgoKc3RydWN0IE90aGVyCnsKCXZpcnR1YWwgdm9pZCBwcmludCgpID0gMDsKCXZpcnR1YWwgfk90aGVyKCkgPSBkZWZhdWx0Owp9OwoKc3RydWN0IEJhc2UKewoJQmFzZShPdGhlciAqbykKCXsKCQlvLT5wcmludCgpOwoJfQoJdmlydHVhbCB+QmFzZSgpID0gZGVmYXVsdDsKfTsKc3RydWN0IERlcml2ZWQgOiBCYXNlCnsKCURlcml2ZWQoKTsKCXZpcnR1YWwgfkRlcml2ZWQoKTsKcHJpdmF0ZToKCXN0cnVjdCBNeTsKCXN0ZDo6dW5pcXVlX3B0cjxNeT4gbXk7Cn07CgppbnQgbWFpbigpCnsKCURlcml2ZWQgZDsKfQoKc3RydWN0IERlcml2ZWQ6Ok15IDogT3RoZXIKewoJc3RkOjpzdHJpbmcgcyA9ICJJdCB3b3JrcyI7Cgl2aXJ0dWFsIHZvaWQgcHJpbnQoKQoJewoJCXN0ZDo6Y291dCA8PCBzIDw8IHN0ZDo6ZW5kbDsKCX0KfTsKRGVyaXZlZDo6RGVyaXZlZCgpCjogbXkobmV3IE15KQosIEJhc2UobXkuZ2V0KCkpCnsKfQpEZXJpdmVkOjp+RGVyaXZlZCgpID0gZGVmYXVsdDsK