#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();
      }
    });
}