(2)しかし、場合分けせずに、そのままやろうとすれば、
以下のようにeval を使うことになります。
(ここももっと良い方法があれば教えてください。)

str = ARGV.shift  # 引数として ClassA を与える
eval('x = ' + str +'.new')
eval('x.out' )   # << ==== (*)

(3) 質問は(*)の行に関してですが、
(Q1) evalを使わないとエラーになるのは何故でしょうか。
(Q2) x を使った作業が以下に延々と続くとした場合、
  逐一evalを使用するのがうっとおしい。
  何か回避策があるでしょうか。

以上です。よろしくお願いします。