問題 #22 ・ オブジェクト指向 ・ 難易度 3
次のプログラムを実行したとき、出力される値として正しいものはどれか。 クラス Calculator は整数型のメンバ変数 base をもち、メソッド adjust と compute を提供する。クラス SpecialCalc は Calculator を継承し、コンストラクタで base の値を変更するとともに、メソッド adjust をオーバーライドしている。compute は SpecialCalc ではオーバーライドされず、Calculator から継承される。
○クラス Calculator整数型: base○コンストラクタ Calculator(整数型: b)base ← b○整数型: adjust(整数型: x)return base + x○整数型: compute(整数型: x)return adjust(x) × 2○クラス SpecialCalc は Calculator を継承する○コンストラクタ SpecialCalc(整数型: b)super(b + 2)○整数型: adjust(整数型: x)return base × x○実行プログラムCalculator: c ← SpecialCalc(3)c.compute(4) の戻り値を出力する
実行の流れを順に追う。 1. SpecialCalc(3) を生成する。SpecialCalc のコンストラクタが呼ばれ、super(b + 2) すなわち super(3 + 2) = super(5) が実行される。 2. 親クラス Calculator のコンストラクタ Calculator(5) が実行され、base ← 5 となる。 3. c.compute(4) を呼び出す。compute は Calculator クラスで定義されたメソッドであり、内部で adjust(x) × 2 を返す。 4. ここで c の実体は SpecialCalc のインスタンスである。オブジェクト指向の多態性(ポリモーフィズム)により、adjust(4) は SpecialCalc でオーバーライドされた adjust が呼ばれる。 5. SpecialCalc の adjust(4): base × x = 5 × 4 = 20 6. compute の計算: adjust(4) × 2 = 20 × 2 = 40 したがって出力される値は 40 である。 この問題のポイントは、親クラスのメソッド compute の中で呼ばれる adjust が、実行時のインスタンスの型に基づいて決定される(動的束縛)という点である。変数 c の宣言型が Calculator であっても、実体が SpecialCalc であれば SpecialCalc の adjust が使われる。
登録すると解いた結果が残り、間違えた問題は日をおいて復習に出ます。
この問題は AI が作り、別の AI に解かせて検証し、人が確認したうえで公開しています。 誤りに気づいたら goku.tore9@gmail.com までお知らせください。
記号の意味に迷ったら擬似言語の記法で確かめられます。