class Number {
public:
  Number plus(Number argument){return *this;}
  Number(){};
};

class Exp {
public:
  virtual Number eval(){}
};
  
class Operator {
public:
  virtual Number op_res(Exp* arg1, Exp* arg2) {}
};

class AddSym : public Operator {
public:
  Number op_res(Exp* arg1, Exp* arg2) {
  // not a violation
    return (arg1->eval()).plus(arg2->eval());
  }
};

class Compound : public Exp {
public:
  Operator* op;
  Exp* arg1;
  Exp* arg2;
  Number eval(){
    op->op_res(arg1, arg2);
  }
};

main(){}
