基本情報 平成29年度 春期 問7:テクノロジ系に関する問題
オブジェクト指向プログラミングにおける, 多相性を実現するためのオーバーラ イドの説明はどれか。
- aオブジェクト内の詳細な仕様や構造を外部から隠蔽すること
- bスーパークラスで定義されたメソッドをサブクラスで再定義むせること正答
- c同一クラス内に, メソッド名が同一で, 引数の型, 個数, 並び順が異なる複数 のメソッドを定義すること
- d複数のクラスの共通する性質をまとめて, 抽象化したクラスを作ること
AI解説(初心者・標準・上級)
理解度に合わせて3レベルの解説を無料で読めます。
答えは b「スーパークラスで定義されたメソッドをサブクラスで再定義する」 です。
オーバーライド=親が決めたルールを子が上書きする、と覚えてください。
たとえば「動物クラスのrun()」を、「犬クラスでは“ワンワン走る”」「猫クラスでは“スタタタ走る”」と書き直すイメージ。同じ「run()」と呼んでも子ごとに違う動きをする、これが多相性(ポリモーフィズム)です。
👉 覚え方:オーバー(上書き)ライド(乗る)=親の定義に上から乗っかる。
ほかの選択肢:a 中身を隠す=カプセル化/c 同じ名前で引数違いを並べる=オーバーロード(似てるけど別物!)/d 共通点を抽象クラスにまとめる=汎化(抽象化)。
なぜこれが正解か
正解は b。オーバーライド(override)はスーパークラス(親)が定義したメソッドを、サブクラス(子)が同じシグネチャ(名前・引数・戻り値)のまま処理内容だけを再定義する仕組み。これにより親型の変数で子インスタンスを扱っても実行時に子の実装が呼ばれ、動的束縛(dynamic binding)による多相性が実現される。
各選択肢の解説
- a:内部実装を外部から見えなくする=カプセル化(情報隠蔽)。
- b:オーバーライド → 正解。
- c:同名で引数の型・個数・順序が異なる複数メソッドを定義=オーバーロード(多重定義)。同じクラス内の話なので親子関係不要。
- d:複数クラスの共通点を抽出して抽象クラスを作る=汎化(generalization)/抽象化。
覚え方・ひっかけ注意
オーバーライドと オーバーロードは出題頻度No.1の引っかけ。ライド=親に「乗る」=親子間で上書き、ロード=「積む」=同じクラスに複数積む、で区別。多相性の実現手段は他に「インタフェース実装」もある。
理論的背景
多相性(polymorphism)は (1) アドホック多相(オーバーロード)、(2) パラメトリック多相(ジェネリクス/テンプレート)、(3) 派生型多相(サブタイプ多相=オーバーライド)に分類される。本問のオーバーライドは (3) に該当。実装は仮想関数テーブル(vtable)を介した動的ディスパッチで、インスタンスごとに保持するvptrから関数アドレスを引く構造。
実装言語ごとの違い
- Java:すべての非staticメソッドがデフォルトで仮想(virtual)。`@Override`アノテーションで明示推奨。`final`修飾で禁止。
- C++:明示的に `virtual` キーワードが必要。なければ静的束縛となり親の実装が呼ばれる。
- C#:`virtual`/`override`/`new` の使い分け。`new` はオーバーライドではなく単なる隠蔽。
- Python:すべてのメソッドが事実上仮想(MROによる動的ディスパッチ)。
設計原則
オーバーライドはLiskovの置換原則(LSP)の遵守が必須。子は親の事前条件を弱め・事後条件を強め、契約を破ってはならない。違反すると派生型多相の前提が崩れ、Open/Closed原則の利点も失われる。
試験での位置づけ
FE「ソフトウェア開発」分野で毎期1問程度出題。オーバーロードとの判別はパターン問題化。応用情報・高度(特にデータベーススペシャリスト以外の上位)ではデザインパターン(Template Method, Strategy)と絡めて問われる。
選択肢の発展補足
dの汎化はUMLクラス図で白抜き三角矢印で表される継承関係。インタフェース実現は破線で区別。c のオーバーロードは演算子オーバーロード(C++, Pythonの`__add__`等)まで含むと表現力が増す。
出典:IPA(情報処理推進機構)公式 基本情報技術者試験 平成29年度 春期 問7/ 公的機関配布資料につき出典明記の上引用。解説は合格ナビによる独自AI解説です。