#include <iostream>
using namespace std;
class A
{
};
class B:public A
{
public:
B() { cout<<"B"<<endl; }
};
class C:public A
{
public:
C() { cout<<"C"<<endl; }
};
class D:public C
{
public:
D() { cout<<"D"<<endl; }
};
typedef A *creator();
creator *Tb[]=
{
[] () -> A* { return new B(); },
[] () -> A* { return new C(); },
[] () -> A* { return new D(); }
};
int main()
{
A *b=Tb[0]();
A *c=Tb[1]();
A *d=Tb[2]();
delete b;
delete c;
delete d;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgQQogIHsKICB9OwogIApjbGFzcyBCOnB1YmxpYyBBCiAgewogICBwdWJsaWM6CiAgIEIoKSB7IGNvdXQ8PCJCIjw8ZW5kbDsgfQogIH07CgpjbGFzcyBDOnB1YmxpYyBBCiAgewogICBwdWJsaWM6CiAgIEMoKSB7IGNvdXQ8PCJDIjw8ZW5kbDsgfQogIH07CgpjbGFzcyBEOnB1YmxpYyBDCiAgewogICBwdWJsaWM6CiAgIEQoKSB7IGNvdXQ8PCJEIjw8ZW5kbDsgfQogIH07Cgp0eXBlZGVmIEEgKmNyZWF0b3IoKTsKY3JlYXRvciAqVGJbXT0KICB7CiAgIFtdICgpIC0+IEEqIHsgcmV0dXJuIG5ldyBCKCk7IH0sCiAgIFtdICgpIC0+IEEqIHsgcmV0dXJuIG5ldyBDKCk7IH0sCiAgIFtdICgpIC0+IEEqIHsgcmV0dXJuIG5ldyBEKCk7IH0KICB9OwoKaW50IG1haW4oKQogIHsKICAgQSAqYj1UYlswXSgpOyAKICAgQSAqYz1UYlsxXSgpOwogICBBICpkPVRiWzJdKCk7CiAgIGRlbGV0ZSBiOwogICBkZWxldGUgYzsKICAgZGVsZXRlIGQ7CiAgIHJldHVybiAwOwogIH0=