virtual を付けてオーバーライドして動作を変えることを「あまりよくない」とする
理由が(オブジェクト指向を知らない人が混乱すること以外)存在しないし、
ふつうにポリモするときにはこれは必須。

virtual をつけずに(誤って)隠ぺいしてしまうことの問題は、昔からある一般的な
シンボルの衝突の問題であって、派生だ基底だという問題ではないから。
これは単に「関数名はよく考えてつけよう」という話。

virtual をつけずに意図して隠ぺいするのはテンプレート等メンバのシグネチャレベル
でのインタフェイスを維持するときに便利だし。

「確かにこれは悪い」っていう例がこれらの利点を打ち消すほどたくさんあれば、
考えを変えるけど。