Arduino the Object Oriented way

Couple of nit comments:

Why int here and not byte?

const int BUTTON_PIN = 7;

Same with state, prevState, pin. variables that are only 0/1 don't need to be ints, and there are no pins above 255, so they also don't need to be int. You have int's all thru the example that could be byte instead.

I like the explanation you provide. This looks like stuff I just code inline in my sketches. MrsCrsossRoads ridicules me for it, but I figure I'm saving processing time by not jumping back & forth in & out of functions, just performing the simple digitalWrite of whatever is starting the class. Also I don't want to take the time to create all that stuff every time, nor can I remember how every class created over the years is used. Basically sounds like I'm a lazy, not too bright coder! I think having to figure that stuff out every so often helps me to keep thinking about what's really going on tho.
My fencing scoring machine is 25 pages long of code - no functions except setup() and loop(). No classes, etc. The code acts like it tho with a couple of flags to indicate between sections that something needs performing - when a score is updated for example, the score variable is updated, a displayUpdate flag is set - the updateScore test gets its shot and checks the flag and updates the display as needed, clearing the flag.
All the code is inline, and if you read it it's basically what someone might write as 3 functions:
void loop(){
checkRFinput();
checkTouchInput();
updateTimeScoreDisplay();
}
However, I also don't like jumping back and forth in a sketch trying to find a section that is referenced, which also leads to my preference for inline code.
Chalk it up to poor programming preferences by a hardware designer looking for speed over code niceness.