#include <iostream>
#include <memory>
using namespace std;
struct A;
struct B;
struct Base {
int y;
static std::unique_ptr<Base> create( size_t n );
virtual ~Base() { }
};
struct A : public Base {int a; virtual ~A(){};};
struct B : public Base {int b; virtual ~B(){};};
std::unique_ptr<Base> Base::create( size_t n ){
if( n == 1 ) return std::unique_ptr<Base>(new A );
else return std::unique_ptr<Base>(new B );
}
int main() {
auto x = static_cast<A*>( Base::create(1).get() );
x->y=1;
x->a=2;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWVtb3J5Pgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpzdHJ1Y3QgQTsKc3RydWN0IEI7CnN0cnVjdCBCYXNlIHsKCWludCB5OwoJc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxCYXNlPiBjcmVhdGUoIHNpemVfdCBuICk7CiAgICB2aXJ0dWFsIH5CYXNlKCkgeyB9Cn07CnN0cnVjdCBBIDogcHVibGljIEJhc2Uge2ludCBhOyB2aXJ0dWFsIH5BKCl7fTt9OwpzdHJ1Y3QgQiA6IHB1YmxpYyBCYXNlIHtpbnQgYjsgdmlydHVhbCB+Qigpe307fTsKCnN0ZDo6dW5pcXVlX3B0cjxCYXNlPiBCYXNlOjpjcmVhdGUoIHNpemVfdCBuICl7CiAgCWlmKCBuID09IDEgKSByZXR1cm4gIHN0ZDo6dW5pcXVlX3B0cjxCYXNlPihuZXcgQSApOwogICAgIGVsc2UgIHJldHVybiAgc3RkOjp1bmlxdWVfcHRyPEJhc2U+KG5ldyBCICk7Cn0KCmludCBtYWluKCkgewoJYXV0byB4ID0gc3RhdGljX2Nhc3Q8QSo+KCBCYXNlOjpjcmVhdGUoMSkuZ2V0KCkgKTsKCXgtPnk9MTsKCXgtPmE9MjsKCXJldHVybiAwOwp9