問題 #9 ・ オブジェクト指向 ・ 難易度 2
次のプログラム中の〔 a 〕に入れる正しい答えを、解答群の中から選べ。 クラス Animal とそれを継承したクラス Dog がある。プログラムを実行したとき、 「ポチはワンと鳴く」と表示したい。
○クラス: Animal文字列型: name○Animal(文字列型: name)自身.name ← name○文字列型: cry()return "..."○手続: introduce()文字列型: s ← 自身.name + "は" + 自身.cry() + "と鳴く"s を表示する○クラス: Dog が Animal を継承○Dog(文字列型: name)〔 a 〕○文字列型: cry()return "ワン"// --- 実行 ---Dog: d ← Dog("ポチ")d.introduce()
【解法の流れ】 1. Dog は Animal を継承している。Animal のコンストラクタは引数 name を受け取り、自身.name に格納する。 2. Dog のコンストラクタでは、親クラス Animal の初期化を行う必要がある。そのためには親クラスのコンストラクタ Animal(name) を呼ぶ。 3. 実行をトレースする。 - Dog("ポチ") が呼ばれる。 - 〔 a 〕で Animal("ポチ") が実行され、自身.name ← "ポチ" となる。 - d.introduce() が呼ばれる。 - introduce() 内で 自身.cry() が呼ばれる。d は Dog のインスタンスなので、Dog でオーバーライドされた cry() が実行され "ワン" が返る。 - s ← "ポチ" + "は" + "ワン" + "と鳴く" → "ポチはワンと鳴く" - "ポチはワンと鳴く" が表示される。 【ポイント】 - 継承時、子クラスのコンストラクタから親クラスのコンストラクタを呼び出してフィールドを初期化する。 - introduce() は親クラス Animal に定義されているが、自身.cry() の呼び出しでは Dog でオーバーライドされた cry() が実行される(ポリモーフィズム)。 【各選択肢の誤りの理由】 - ア: 親コンストラクタを経由せず直接代入しており、継承の正しい記述ではない。 - ウ: 自分自身のコンストラクタを再帰呼び出しするため無限ループになる。 - エ: 引数のローカル変数に代入しているだけで、フィールド自身.name は未定義のまま。
登録すると解いた結果が残り、間違えた問題は日をおいて復習に出ます。
この問題は AI が作り、別の AI に解かせて検証し、人が確認したうえで公開しています。 誤りに気づいたら goku.tore9@gmail.com までお知らせください。
記号の意味に迷ったら擬似言語の記法で確かめられます。