Mを継承してるのが間違い
Mは実装を共通化してるだけだろ
Mをコンポジションにしてデリゲート
C++ならprivate継承にしてデリゲートはテンプレートにすりゃいい