#include <iostream>
using namespace std;
template<class T>class MyArray{
public: T* database[20];
public: T* get(int index){return database[index];}
public: void set(int index,T* t){database[index]=t;}
};
template<class T,class T2> class Adapter{
public: MyArray<T>* underlying;
public: void setUnderlying(MyArray<T>* pUnder){underlying=pUnder;}
public: T2* get(int index){return static_cast<T2*>(underlying->get(index));}
};
class B{};
class C:public B{};
class D:public C{};
class E:public D{};
int main() {
MyArray<B> bs; bs.set(0,new C());
Adapter<B,C> cs;
cs.setUnderlying(&bs);
C* c=cs.get(0);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKCnRlbXBsYXRlPGNsYXNzIFQ+Y2xhc3MgTXlBcnJheXsKICAgIHB1YmxpYzogVCogZGF0YWJhc2VbMjBdOwogICAgcHVibGljOiBUKiBnZXQoaW50IGluZGV4KXtyZXR1cm4gZGF0YWJhc2VbaW5kZXhdO30KICAgIHB1YmxpYzogdm9pZCBzZXQoaW50IGluZGV4LFQqIHQpe2RhdGFiYXNlW2luZGV4XT10O30KfTsKdGVtcGxhdGU8Y2xhc3MgVCxjbGFzcyBUMj4gY2xhc3MgQWRhcHRlcnsKCXB1YmxpYzogTXlBcnJheTxUPiogdW5kZXJseWluZzsKCXB1YmxpYzogdm9pZCBzZXRVbmRlcmx5aW5nKE15QXJyYXk8VD4qIHBVbmRlcil7dW5kZXJseWluZz1wVW5kZXI7fQoJcHVibGljOiBUMiogZ2V0KGludCBpbmRleCl7cmV0dXJuIHN0YXRpY19jYXN0PFQyKj4odW5kZXJseWluZy0+Z2V0KGluZGV4KSk7fQp9OwpjbGFzcyBCe307CmNsYXNzIEM6cHVibGljIEJ7fTsKY2xhc3MgRDpwdWJsaWMgQ3t9OwpjbGFzcyBFOnB1YmxpYyBEe307CgppbnQgbWFpbigpIHsKCU15QXJyYXk8Qj4gYnM7ICBicy5zZXQoMCxuZXcgQygpKTsKCUFkYXB0ZXI8QixDPiBjczsKCWNzLnNldFVuZGVybHlpbmcoJmJzKTsKCUMqIGM9Y3MuZ2V0KDApOwoJcmV0dXJuIDA7Cn0=