#include <iostream>
using namespace std;
class ITestA
{
public:
virtual void methodA() = 0;
};
class ITestB : public ITestA
{
public:
virtual void methodB() = 0;
};
template <class T>
class CBaseAImpl : public T
{
public:
virtual void methodA() override
{
cout <<"A";
}
};
template <class T>
class CBaseBImpl : public CBaseAImpl<T>
{
public:
virtual void methodB() override
{
cout <<"B";
}
};
typedef CBaseAImpl<ITestA> CBaseA;
typedef CBaseBImpl<ITestB> CBaseB;
int main() {
CBaseB b;
b.methodA();
b.methodB();
ITestA* a =&b;
a->methodA();
ITestB *bp = &b;
bp->methodA();
bp->methodB();
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgSVRlc3RBCnsKcHVibGljOgogICAgdmlydHVhbCB2b2lkIG1ldGhvZEEoKSA9IDA7Cn07CgpjbGFzcyBJVGVzdEIgOiBwdWJsaWMgSVRlc3RBCnsKcHVibGljOgogICAgdmlydHVhbCB2b2lkIG1ldGhvZEIoKSA9IDA7Cn07Cgp0ZW1wbGF0ZSA8Y2xhc3MgVD4KY2xhc3MgQ0Jhc2VBSW1wbCA6IHB1YmxpYyBUCnsKcHVibGljOgogICAgdmlydHVhbCB2b2lkIG1ldGhvZEEoKSBvdmVycmlkZQogICAgewogICAgICAgIGNvdXQgPDwiQSI7IAogICAgfQp9OwoKCnRlbXBsYXRlIDxjbGFzcyBUPgpjbGFzcyBDQmFzZUJJbXBsIDogcHVibGljIENCYXNlQUltcGw8VD4KewpwdWJsaWM6CiAgICB2aXJ0dWFsIHZvaWQgbWV0aG9kQigpIG92ZXJyaWRlCiAgICB7CiAgICAgIGNvdXQgPDwiQiI7IAogICAgfQp9OwoKdHlwZWRlZiBDQmFzZUFJbXBsPElUZXN0QT4gQ0Jhc2VBOwp0eXBlZGVmIENCYXNlQkltcGw8SVRlc3RCPiBDQmFzZUI7CgppbnQgbWFpbigpIHsKCUNCYXNlQiBiOwogICAgYi5tZXRob2RBKCk7CiAgICBiLm1ldGhvZEIoKTsKCiAgICBJVGVzdEEqIGEgPSZiOwogICAgYS0+bWV0aG9kQSgpOwoKICAgIElUZXN0QiAqYnAgPSAmYjsKICAgIGJwLT5tZXRob2RBKCk7CiAgICBicC0+bWV0aG9kQigpOwoKCXJldHVybiAwOwp9