#include <memory>
#include <iostream>
#include <string>
#include <vector>
#include <random>
class Animal {
public :
virtual const char * Cry( ) {
return "VOID." ;
}
virtual const char * Name( ) {
return "Animal" ;
}
typedef std:: shared_ptr < Animal> AnimalHolder;
} ;
class Human : public Animal {
const char * Cry( ) {
return "バルス!!!" ;
}
const char * Name( ) {
return "パズー" ;
}
} ;
class Dog : public Animal {
const char * Cry( ) {
return "ワン!" ;
}
const char * Name( ) {
return "犬" ;
}
} ;
class Cat : public Animal {
const char * Cry( ) {
return "ニャー(チャオチュールクレ!!)" ;
}
const char * Name( ) {
return "ぬこ" ;
}
} ;
Animal:: AnimalHolder AnimalFactory( std:: size_t X) {
switch ( X) {
case 0 :
return std:: make_shared < Human> ( ) ;
case 1 :
return std:: make_shared < Dog> ( ) ;
case 2 :
return std:: make_shared < Cat> ( ) ;
}
return Animal:: AnimalHolder ( ) ;
}
int main( ) {
int N = 2 ;
std:: minstd_rand mr;
std:: uniform_int_distribution <> ui( 0 , N) ;
std:: vector < Animal:: AnimalHolder > v;
for ( std:: size_t i = 0 ; i < 16 ; i++ ) {
v.push_back ( AnimalFactory( ui( mr) ) ) ;
}
for ( auto & o : v) {
std:: cout << o- > Name( ) << " is Cry! " << o- > Cry( ) << std:: endl ;
}
return 0 ;
}
I2luY2x1ZGUgPG1lbW9yeT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cmFuZG9tPgpjbGFzcyBBbmltYWwgewpwdWJsaWM6Cgl2aXJ0dWFsIGNvbnN0IGNoYXIqIENyeSgpIHsKCQlyZXR1cm4gIlZPSUQuIjsKCX0KCXZpcnR1YWwgY29uc3QgY2hhciogTmFtZSgpIHsKCQlyZXR1cm4gIkFuaW1hbCI7Cgl9Cgl0eXBlZGVmIHN0ZDo6c2hhcmVkX3B0cjxBbmltYWw+IEFuaW1hbEhvbGRlcjsKfTsKCmNsYXNzIEh1bWFuIDpwdWJsaWMgQW5pbWFsIHsKCWNvbnN0IGNoYXIqIENyeSgpIHsKCQlyZXR1cm4gIuODkOODq+OCue+8ge+8ge+8gSI7Cgl9Cgljb25zdCBjaGFyKiBOYW1lKCkgewoJCXJldHVybiAi44OR44K644O8IjsKCX0KfTsKCmNsYXNzIERvZyA6cHVibGljIEFuaW1hbCB7Cgljb25zdCBjaGFyKiBDcnkoKSB7CgkJcmV0dXJuICAi44Ov44Oz77yBIjsKCX0KCWNvbnN0IGNoYXIqIE5hbWUoKSB7CgkJcmV0dXJuICLniqwiOwoJfQp9OwpjbGFzcyBDYXQgOnB1YmxpYyBBbmltYWwgewoJY29uc3QgY2hhciogQ3J5KCkgewoJCXJldHVybiAi44OL44Oj44O8KOODgeODo+OCquODgeODpeODvOODq+OCr+ODrO+8ge+8gSkiOwoJfQoJY29uc3QgY2hhciogTmFtZSgpIHsKCQlyZXR1cm4gIuOBrOOBkyI7Cgl9Cn07CgoKQW5pbWFsOjpBbmltYWxIb2xkZXIgQW5pbWFsRmFjdG9yeShzdGQ6OnNpemVfdCBYKSB7Cglzd2l0Y2ggKFgpIHsKCQljYXNlIDA6CgkJCXJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEh1bWFuPigpOwoJCWNhc2UgMToKCQkJcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8RG9nPigpOwoJCWNhc2UgMjoKCQkJcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8Q2F0PigpOwoJfQoKCXJldHVybiBBbmltYWw6OkFuaW1hbEhvbGRlcigpOwp9CgppbnQgbWFpbigpIHsKCglpbnQgTiA9IDI7CglzdGQ6Om1pbnN0ZF9yYW5kIG1yOwoJc3RkOjp1bmlmb3JtX2ludF9kaXN0cmlidXRpb248PiB1aSgwLCBOKTsKCXN0ZDo6dmVjdG9yPEFuaW1hbDo6QW5pbWFsSG9sZGVyPiB2OwoKCWZvciAoc3RkOjpzaXplX3QgaSA9IDA7IGkgPCAxNjsgaSsrKSB7CgkJdi5wdXNoX2JhY2soQW5pbWFsRmFjdG9yeSh1aShtcikpKTsKCX0KCglmb3IgKGF1dG8mIG8gOiB2KSB7CgkJc3RkOjpjb3V0IDw8IG8tPk5hbWUoKSA8PCAiIGlzIENyeSEgIjw8IG8tPkNyeSgpIDw8IHN0ZDo6ZW5kbDsKCX0KCgoJcmV0dXJuIDA7Cgp9