対象試験と出題頻度

ポリモーフィズム(多態性・多相性)は、基本情報技術者・応用情報技術者で出題されるテーマです。

オブジェクト指向の三大要素(カプセル化継承・ポリモーフィズム)を問う問題の定番であり、「継承」「オーバーライド」「メッセージパッシング」との違いを正確に区別できるかがポイントになります。

詳細をクリックして確認
対象試験:
基本情報技術者
応用情報技術者
出題頻度:
★★★☆☆
ランクB(標準)覚えておくと有利

用語の定義

情報処理試験を勉強していると、「ポリモーフィズムって結局何?継承と何が違うの?」と混乱しがちです。

ポリモーフィズム(Polymorphism:多態性・多相性)とは、一言で言うと

 「同じメッセージを送っても、受け手のオブジェクトによって異なる動作をする性質」

のことです。

イメージとしては、「『鳴いて』と言ったら、犬は『ワン』、猫は『ニャー』と返す」こと。

命令(メッセージ)は同じでも、受け取る側の種類によって反応が変わる。これがポリモーフィズムの考え方です。

📊 ポリモーフィズムの基本情報

項目 内容
英語名 Polymorphism(poly=多数、morph=形態)
日本語名 多態性、多相性、多様性
分類 オブジェクト指向の三大要素のひとつ(カプセル化・継承・ポリモーフィズム)
実現手段 オーバーライド(メソッドの再定義)

解説

オブジェクト指向プログラミングでは、データとそれに対する操作をひとまとめにした「オブジェクト」を組み合わせてシステムを構築します。

カプセル化で内部を隠蔽し、継承で上位クラスの機能を引き継いだうえで、さらに「呼び出し方を変えずに動作だけ切り替えたい」という場面で登場するのがポリモーフィズムです。

 

オーバーライドで実現する仕組み

上位クラス(スーパークラス)で定義したメソッドを、下位クラス(サブクラス)が自分の役割に応じて再定義することをオーバーライドと呼びます。

 

呼び出す側は「どのサブクラスか」を意識せず同じメソッド名で呼び出すだけで、実行時に受け手のクラスに応じた処理が自動的に選ばれます。

▶ コードで見るポリモーフィズム(クリックで展開)

以下は擬似コードです。試験の科目Bでもこの形式のコードが出題されます。

class Animal {
    method cry() {
        print("...")
    }
}

class Dog extends Animal {
    method cry() {          /* オーバーライド */
        print("ワン")
    }
}

class Cat extends Animal {
    method cry() {          /* オーバーライド */
        print("ニャー")
    }
}

/* 呼び出し側は同じ cry() を呼ぶだけ */
Animal a1 = new Dog()
Animal a2 = new Cat()
a1.cry()   /* → "ワン"   */
a2.cry()   /* → "ニャー" */

呼び出し側は Animal 型の変数として扱っているだけですが、実際に動くのは DogCat それぞれのメソッドです。この「呼び出し側を変えずに動作が切り替わる」点がポリモーフィズムの核心です。

図解:メッセージと応答の関係

ポリモーフィズムの動作イメージ

呼び出し側
cry() を呼ぶ
↓ 同じメッセージ「cry()」
Dog
→ “ワン”
Cat
→ “ニャー”
Bird
→ “チュン”

オブジェクト指向の三大要素との関係

カプセル化は「内部を隠して外部には操作だけ公開する」仕組み、継承は「上位クラスの属性や操作を下位クラスが引き継ぐ」仕組みです。

ポリモーフィズムは継承を前提として成立し、オーバーライドによって「同じインタフェースで異なる振る舞い」を実現します。

三者はそれぞれ独立した概念ですが、組み合わせることで保守性と拡張性の高いプログラムが構築できます。

📊 オブジェクト指向の三大要素を比較

要素 一言で言うと キーワード
カプセル化 データと手続きをまとめて内部を隠蔽する 情報隠蔽、ブラックボックス
継承 上位クラスの特性を下位クラスが引き継ぐ インヘリタンス、差分プログラミング
ポリモーフィズム 同じメッセージで受け手ごとに異なる動作をする 多態性、多相性、オーバーライド

では、この用語が試験でどのように出題されるか見ていきましょう。

💡 ポリモーフィズムの核心を3行で

・同じメッセージを送っても、受け手のオブジェクトによって動作が変わる性質
・実現手段はオーバーライド(上位クラスのメソッドをサブクラスで再定義)
・カプセル化は「隠蔽」、継承は「引き継ぎ」、ポリモーフィズムは「動作の切り替え」と整理する


試験ではこう出る!

ポリモーフィズムは、オブジェクト指向の概念を問う定番テーマとして、科目Aの知識問題と科目Bのコード読解の両方で出題されています。

出題パターンは大きく2つに分かれます。

📊 過去問での出題実績

試験回 出題内容 問われたポイント
FE R7年度
科目A 問12
異なるクラスのオブジェクトを同一インタフェースで操作し、クラスに応じた異なる動作を可能にする特性を選ぶ問題。 ・「同一インタフェース+異なる動作」=多相性(ポリモーフィズム)
・委譲、継承、コンポジションがひっかけ選択肢
FE H26秋
午前 問47
多相性を実現するときに特有のものを選ぶ問題。 ・正解はオーバーライド
・カプセル化、多重継承、メッセージパッシングがひっかけ
AP H21春
午前 問46
「営業状況を報告してください」という同じメッセージに対し、営業課長と営業部員が異なる報告を返す特性を選ぶ問題。 ・SW H17春 問41の流用問題
・カプセル化・継承・抽象化がひっかけ

📝 IPA試験での出題パターン

パターン1:「この特性は何か?」と用語名を問う
問題文に「同じメッセージで異なる動作」という状況が示され、それがカプセル化・継承・ポリモーフィズム・抽象化のどれかを選ばせる形式。キーワードは「同じメッセージ」「異なる動作」「受け手によって変わる」。

 

パターン2:「多相性の実現に必要なものは何か?」と手段を問う
FE H26秋のように、ポリモーフィズムを実現するために必要な仕組み=オーバーライドを選ばせる形式。「オーバーロード(引数の違いによるメソッドの多重定義)」とのひっかけに注意。

 

試験ではここまででOKです。「同じメッセージ+異なる動作=ポリモーフィズム」「実現手段=オーバーライド」の2点を押さえれば得点できます。


【確認テスト】理解度チェック

ここまでの内容を理解できたか、簡単なクイズで確認してみましょう。


Q. オブジェクト指向プログラミングにおいて、同じメッセージを送っても受け手のオブジェクトによって異なる動作をする性質を何と呼ぶか。最も適切なものを選んでください。

  • A. データと手続きをひとまとめにし、内部の実装を外部から隠蔽する仕組み。
  • B. 同一のインタフェースで操作しても、受け手のクラスに応じて異なる処理が実行される性質。
  • C. 上位クラスで定義された属性や操作を下位クラスがそのまま引き継ぎ、差分だけを追加定義する仕組み。

正解と解説を見る

正解:B

解説:
ポリモーフィズム(多態性)は、同一のインタフェースで操作したとき、受け手のクラスに応じて異なる処理が実行される性質です。「同じメッセージ」「異なる動作」がキーワードになります。

選択肢Aはカプセル化の説明です。データと手続きをまとめてブラックボックス化する仕組みであり、動作の切り替えとは無関係です。選択肢Cは継承(インヘリタンス)の説明です。上位クラスの特性を引き継ぐ仕組みであり、ポリモーフィズムの前提にはなりますが、それ自体は「同じメッセージで動作が変わる」性質を指しません。


よくある質問(FAQ)

Q. オーバーライドとオーバーロードは何が違いますか?

オーバーライドは、上位クラスで定義済みのメソッドを下位クラスで「同じメソッド名・同じ引数」のまま処理内容だけ再定義することです。一方、オーバーロードは「同じメソッド名だが引数の型や数が異なる」複数のメソッドを同一クラス内に定義することを指します。ポリモーフィズムを実現するのはオーバーライドです。試験ではこの2つの用語が選択肢に並ぶことがあるため、「再定義=オーバーライド」「多重定義=オーバーロード」と整理してください。

Q. ポリモーフィズムを使うと実務で何がうれしいのですか?

新しい種類のオブジェクトを追加するとき、呼び出し側のコードを一切変更せずに機能を拡張できる点が最大のメリットです。たとえば、決済処理で「クレジットカード」「銀行振込」「電子マネー」のクラスがあったとします。共通の「pay()」メソッドを各クラスでオーバーライドしておけば、新たに「QRコード決済」クラスを追加しても、呼び出し元は pay() を呼ぶだけで対応が完了します。

Q. 「抽象クラス」や「インタフェース」との関係を教えてください。

抽象クラスは、メソッドの名前や引数だけを定義し、具体的な処理内容を持たないクラスです。インタフェースは、実装を一切持たず「このメソッドを必ず実装しなさい」という契約を定義するものです。どちらもサブクラスに対して「同じメソッド名を実装すること」を強制するため、ポリモーフィズムを確実に成立させる土台として機能します。JavaやC#などのオブジェクト指向言語で頻繁に使われる仕組みです。