#include <iostream>
using namespace std;
class A
{
public:
  virtual int Test(int) { cout << "A::Test:" << this << endl; return 9487; };
  virtual int Same() = 0;
  virtual ~A() {}
};
class B
{
public:
  virtual int Test(float) { cout << "B::Test:" << this << endl; return 94.87f; };
  virtual int Same() = 0;
  virtual ~B() {}
};
class C : public A, public B
{
public:
  virtual int Test(int) override { cout << "C::Test int:" << this << endl; return 9487; }
  virtual int Test(float) override { cout << "C::Test float: " << this << endl; return 1.1f; }
  int Same() override { cout << this << endl;  return 5566; }

};
int main() {
  C* ptr = new C;
  cout << "((A*)ptr):" << ((A*)ptr) << endl;
  cout << "((B*)ptr):" << ((B*)ptr) << endl;
  ptr->A::Test(1);
  ptr->B::Test(2.2f);
  ((A*)ptr)->Test(1);
  ((B*)ptr)->Test(2.2f);

  void* ptrA = ((A*)ptr);
  void* ptrB = ((B*)ptr);
  ((A*)ptrA)->Test(1);
  ((B*)ptrB)->Test(2.2f);
  ((B*)ptrA)->Test(2.2f);
  ((A*)ptrA)->Same();
  ((B*)ptrB)->Same();
  ((B*)ptrA)->Same();
  ptr->Same();
  return 0;
}