#include <iostream>

class Base {
public:
  virtual ~Base() {}
  virtual void ShowInfo() const = 0;
};

class Mixin {
public:
  void ShowThis() const {
    std::cout << "this: " << (void*) this
              << " as seen from " << __PRETTY_FUNCTION__
              << std::endl;
  }
};

class Derived : public Base, public Mixin {
public:
  virtual void ShowInfo() const {
    std::cout << "this: " << (void*) this
              << " as seen from " << __PRETTY_FUNCTION__
              << std::endl;
    ShowThis();
  }
};

// This mixin contain a virtual function
class VMixin {
public:
  virtual void ShowThis() const {
    std::cout << "this: " << (void*) this
              << " as seen from " << __PRETTY_FUNCTION__
              << std::endl;
  }
};

class VDerived : public Base, public VMixin {
public:
  virtual void ShowInfo() const {
    std::cout << "this: " << (void*) this
              << " as seen from " << __PRETTY_FUNCTION__
              << std::endl;
    ShowThis();
  }
};

int main() {
  Derived d;
  d.ShowInfo();
  VDerived vd;
  vd.ShowInfo();
}


