#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:
using CalcA_Impl::calcA;
//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();
}
});
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKY2xhc3MgSUEgewogcHVibGljOgogIHZpcnR1YWwgaW50IGNhbGNBKCkgPSAwOwp9OwoKY2xhc3MgSUI6IHZpcnR1YWwgcHVibGljIElBIHsKIHB1YmxpYzoKICB2aXJ0dWFsIGludCBjYWxjQigpID0gMDsKfTsKCmNsYXNzIENhbGNBX0ltcGwgOiB2aXJ0dWFsIHB1YmxpYyBJQSB7CiBwdWJsaWM6CiAgdmlydHVhbCBpbnQgY2FsY0EoKSB7IGNvdXQgPDwgImRlZmF1bHQgY2FsY0EoKVxuIjsgcmV0dXJuIDA7IH0KfTsKCmNsYXNzIEEgOiBwdWJsaWMgQ2FsY0FfSW1wbCB7fTsKY2xhc3MgQiA6IHB1YmxpYyBJQiwgcHVibGljIENhbGNBX0ltcGwgIHsKIHB1YmxpYzoKICB1c2luZyBDYWxjQV9JbXBsOjpjYWxjQTsKICAvL3ZpcnR1YWwgaW50IGNhbGNBKCkgeyByZXR1cm4gQ2FsY0FfSW1wbDo6Y2FsY0EoKTsgfQogIHZpcnR1YWwgaW50IGNhbGNCKCkgeyBjb3V0IDw8ICJCOjpjYWxjQigpXG4iOyByZXR1cm4gMDsgfQp9OwoKaW50IG1haW4oKSB7CiAgICB2ZWN0b3I8SUEqPiB2OwogICAgdi5wdXNoX2JhY2sgKG5ldyBBKTsKICAgIHYucHVzaF9iYWNrIChuZXcgQik7CiAgICBmb3JfZWFjaCAodi5iZWdpbigpLCB2LmVuZCgpLCBbXShJQSogaWEpIHsKICAgICAgaWEtPmNhbGNBKCk7CiAgICAgIElCICpiID0gZHluYW1pY19jYXN0PElCKj4oaWEpOwogICAgICBpZiAoYikgewogICAgICAgIGItPmNhbGNCKCk7CiAgICAgIH0KICAgIH0pOwp9