Multiple Inhertiance

#include < stdio.h>

class A
{
public:
  virtual char f(void) { return 'A'; }
  virtual char h(void) { return 'A'; }
  char g(void) { return 'A'; }
  char tf(void) { return f(); }
  char tg(void) { return g(); }
};

class B
{
public:
  virtual char f(void) { return 'B'; }
  virtual char h(void) { return 'B'; }
  char g(void) { return 'B'; }
  char tf(void) { return f(); }
  char tg(void) { return g(); }
};

class C : public A
{
public:
  char f(void) { return 'C'; }
  char g(void) { return 'C'; }
  virtual char h(void) { return 'C'; }
};

class D : public B
{
public:
  char f(void) { return 'D'; }
  char g(void) { return 'D'; }
  virtual char h(void) { return 'D'; }
};

class E : public C, public D
{
public:
  char h(void) { return 'E'; }
};

class F : public D, public C
{
public:
  char h(void) { return 'F'; }
};

int main()
{
   E *e = new E;
   F *f = new F;

   printf("%c %c %c %c %c %c %c %c %c %c ",
//   e->f(),   // ambiguous going up the hierarchy
   ((A *)e)->f(),  // C
   ((B *)e)->f(),  // D
//   e->g(),   // ambiguous going up the hierarchy
   ((A *)e)->g(),  // A
   ((B *)e)->g(),  // B
   ((A *)e)->h(),  // E
   ((B *)e)->h(),  // E
   ((A *)f)->h(),  // F
   ((B *)f)->h(),  // F
   ((C *)f)->h(),  // F
   ((D *)f)->h()  // F
   // f->tf(),     // ambiguous
   // f->tg(),     // ambiguous
   // e->tf(),     // ambiguous
   // e->tg());    // ambiguous
   );
   printf("\n");
}