#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class IA {
public:
virtual int calcA() = 0;
};
class IB: virtual public IA {
public:
virtual int calcB() = 0;
};
class CalcA_Impl : virtual public IA {
public:
virtual int calcA() { cout << "default calcA()\n"; return 0; }
};
class A : public CalcA_Impl {};
class B : public IB, public CalcA_Impl {
public:
virtual int calcA() { return CalcA_Impl::calcA(); }
virtual int calcB() { cout << "B::calcB()\n"; return 0; }
};
int main() {
vector<IA*> v;
v.push_back (new A);
v.push_back (new B);
for_each (v.begin(), v.end(), [](IA* ia) {
ia->calcA();
IB *b = dynamic_cast<IB*>(ia);
if (b) {
b->calcB();
}
});
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgSUEgewogcHVibGljOgogIHZpcnR1YWwgaW50IGNhbGNBKCkgPSAwOwp9OwoKY2xhc3MgSUI6IHZpcnR1YWwgcHVibGljIElBIHsKIHB1YmxpYzoKICB2aXJ0dWFsIGludCBjYWxjQigpID0gMDsKfTsKCmNsYXNzIENhbGNBX0ltcGwgOiB2aXJ0dWFsIHB1YmxpYyBJQSB7CiBwdWJsaWM6CiAgdmlydHVhbCBpbnQgY2FsY0EoKSB7IGNvdXQgPDwgImRlZmF1bHQgY2FsY0EoKVxuIjsgcmV0dXJuIDA7IH0KfTsKCmNsYXNzIEEgOiBwdWJsaWMgQ2FsY0FfSW1wbCB7fTsKY2xhc3MgQiA6IHB1YmxpYyBJQiwgcHVibGljIENhbGNBX0ltcGwgIHsKIHB1YmxpYzoKICB2aXJ0dWFsIGludCBjYWxjQSgpIHsgcmV0dXJuIENhbGNBX0ltcGw6OmNhbGNBKCk7IH0KICB2aXJ0dWFsIGludCBjYWxjQigpIHsgY291dCA8PCAiQjo6Y2FsY0IoKVxuIjsgcmV0dXJuIDA7IH0KfTsKCmludCBtYWluKCkgewogICAgdmVjdG9yPElBKj4gdjsKICAgIHYucHVzaF9iYWNrIChuZXcgQSk7CiAgICB2LnB1c2hfYmFjayAobmV3IEIpOwogICAgZm9yX2VhY2ggKHYuYmVnaW4oKSwgdi5lbmQoKSwgW10oSUEqIGlhKSB7CiAgICAgIGlhLT5jYWxjQSgpOwogICAgICBJQiAqYiA9IGR5bmFtaWNfY2FzdDxJQio+KGlhKTsKICAgICAgaWYgKGIpIHsKICAgICAgICBiLT5jYWxjQigpOwogICAgICB9CiAgICB9KTsKfQ==