#include <iostream>
#include <vector>
using namespace std;
class A
{
public:
virtual void call_bar() = 0;
virtual ~A() {}
};
template <typename T>
class B : public A
{
public:
virtual void call_bar() override
{
bar(static_cast<T*>(this));
}
};
class C: public B<C>
{
};
void bar(C* c)
{
cout << "C" << endl;
}
typedef std::vector<A*> a_list;
int main() {
C c;
A* a = &c;
a->call_bar();
a_list b;
b.push_back(a);
for(auto& ref : b)
ref->call_bar();
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKICAgIGNsYXNzIEEKICAgIHsKICAgIHB1YmxpYzoKICAgICAgdmlydHVhbCB2b2lkIGNhbGxfYmFyKCkgPSAwOwogICAgICB2aXJ0dWFsIH5BKCkge30KICAgIH07CgogICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICBjbGFzcyBCIDogcHVibGljIEEKICAgIHsKICAgIHB1YmxpYzoKICAgICAgdmlydHVhbCB2b2lkIGNhbGxfYmFyKCkgb3ZlcnJpZGUKICAgICAgewogICAgICAgIGJhcihzdGF0aWNfY2FzdDxUKj4odGhpcykpOwogICAgICB9CiAgICB9OwogICAgCiAgICBjbGFzcyBDOiBwdWJsaWMgQjxDPgogICAgewogICAgfTsKICAgIAogICAgdm9pZCBiYXIoQyogYykKICAgIHsKICAgIAljb3V0IDw8ICJDIiA8PCBlbmRsOwogICAgfQogICAgCiAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPEEqPiBhX2xpc3Q7CgppbnQgbWFpbigpIHsKCUMgYzsKCUEqIGEgPSAmYzsKCWEtPmNhbGxfYmFyKCk7CgkKCWFfbGlzdCBiOwoJYi5wdXNoX2JhY2soYSk7Cglmb3IoYXV0byYgcmVmIDogYikKCQlyZWYtPmNhbGxfYmFyKCk7CgkvLyB5b3VyIGNvZGUgZ29lcyBoZXJlCglyZXR1cm4gMDsKfQ==