1. I'm actually not sure why the concept of a boolean expression should even exist; I think I will get rid of it. In PL there is the analogous question of embedding types in your syntax vs making an orthogonal type checking semantics. I think orthogonal is usually the right answer and makes more sense here.
2. I will leave a comment in the visitor

inheritance in this direction made sense if BoolExprVisitor supports only a subset of ExprVisitor methods, but I realize BoolExprVisitor really needs to support visitation of all expressions: thus comment 1