struct base
{
  enum mode : short { in, out, top, bottom };
  enum state { pass, fail, unknown };
  typedef long int_type;
};

struct C1 : public base
{
  mode		_M_type;
};

// virtual by derivation
struct C2 : virtual public base
{
  mode		_M_type;
};

// virtual by member function
struct C3 : public base
{
  mode		_M_type;

  virtual ~C3() { };
};

// abstract virtual by member function
struct C4 : public base
{
  mode		_M_type;

  virtual void foo() = 0;
};

int main()
{
  C1 obj1;
  C2 obj2;
  C3 obj3;
  //  C4 obj4; XXX abstract
  return 0;
}