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