対象試験と出題頻度

継承(インヘリタンス)は、基本情報技術者・応用情報技術者で出題されるテーマです。

オブジェクト指向の基本概念を問う定番問題として繰り返し登場しており、「カプセル化」「多態性(ポリモーフィズム)」「抽象化」との違いを正確に区別できるかが問われます。

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

用語の定義

情報処理試験を勉強していると、「継承って結局何?クラスのコピーとどう違うの?」と混乱しがちです。

継承(Inheritance:インヘリタンス)とは、一言で言うと

 「親クラス(スーパークラス)の属性やメソッドを、子クラス(サブクラス)がそのまま引き継いで使える仕組み」

のことです。

イメージとしては、「親から受け継ぐ家業」です。

料理店の家庭に生まれた子どもは、親が培ったレシピや調理技術(属性・メソッド)をそのまま受け継ぎます。さらに、子どもは自分だけの新メニューを追加したり、既存の味付けをアレンジ(オーバーライド)したりできます。

ゼロから修行をやり直す必要がない。これが継承の考え方です。

📊 継承の基本情報

項目 内容
英語名 Inheritance(インヘリタンス)
分類 オブジェクト指向の三大基本概念の一つ(カプセル化・継承・多態性)
最大の利点 差分プログラミング(変更・追加部分だけ記述すればよい)が可能になる
関連する用語 スーパークラス(親)、サブクラス(子)、オーバーライド、多重継承

解説

オブジェクト指向プログラミングでは、データ(属性)と処理(メソッド)をひとまとめにした「クラス」を設計の基本単位とします。しかし、似た機能を持つクラスを毎回ゼロから書くと、コードの重複が膨大になり保守性が下がります。

この問題を解決するために導入されたのが継承です。共通部分を親クラスにまとめ、子クラスでは差分だけを記述する「差分プログラミング」により、コードの再利用性と保守性を両立します。

 

継承の構造を図解で理解する

📐 継承のクラス階層図

Animal(親クラス)
属性:name, age
メソッド:eat(), sleep()
▼ 継承

Dog(子クラス)
+ 属性:breed
+ メソッド:bark()
※ eat(), sleep() は親から継承
Cat(子クラス)
+ 属性:indoor
+ メソッド:purr()
※ eat(), sleep() は親から継承

DogクラスとCatクラスは、Animalクラスのname・age属性やeat()・sleep()メソッドをそのまま使えます。

それぞれのクラスでは、自分固有の属性やメソッドだけを追加すれば済むわけです。

 

コードで見る継承の動き

▶ Javaによる継承のコード例(クリックで展開)
// 親クラス(スーパークラス)
class Animal {
    String name;
    int age;

    void eat() {
        System.out.println(name + "は食事中");
    }
}

// 子クラス(サブクラス)- extends で継承
class Dog extends Animal {
    String breed;

    void bark() {
        System.out.println("ワン!");
    }
}

// 使用例
Dog dog = new Dog();
dog.name = "ポチ";  // 親クラスの属性を使える
dog.eat();              // 親クラスのメソッドを使える
dog.bark();             // 子クラス固有のメソッド

Javaでは extends キーワードで親クラスを指定します。DogクラスはAnimalクラスのnameやeat()を再定義せずに利用できています。

オーバーライドとの関係

子クラスは親クラスのメソッドをそのまま使うだけでなく、同名のメソッドを再定義して動作を上書きできます。これをオーバーライドと呼びます。

先ほどの図で言えば、DogクラスがAnimalクラスのeat()を「ドッグフードを食べる」に書き換えるようなイメージです。

 

なお、名前が似ている「オーバーロード」は、同一クラス内で同名メソッドを引数の型や数を変えて複数定義することであり、継承とは直接関係しません。

 

他のオブジェクト指向概念との比較

概念 意味 ひと言で
継承 親クラスの属性・メソッドを子クラスが引き継ぐ 「親の能力をもらう」
カプセル化 データとメソッドをひとまとめにし、内部を外部から隠蔽する 「中身を見せない」
多態性 同じメッセージに対して受け手ごとに異なる動作をする 「相手次第で動きが変わる」
抽象化 複数のオブジェクトから共通する性質を抜き出して概念を定義する 「共通点をくくり出す」

ここだけは確実に押さえてください。

継承は「親の能力を子が引き継ぐ」、カプセル化は「中身を隠す」、多態性は「受け手で動きが変わる」。この3つの区別が問題を解くカギです。

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

💡 継承の核心を3行で

・親クラスの属性・メソッドを子クラスがそのまま引き継ぎ、差分だけ追加する仕組み
・コードの再利用性と保守性を高めるのが最大の目的
・カプセル化は「隠蔽」、多態性は「受け手次第の動作」と整理して区別する


試験ではこう出る!

継承は、オブジェクト指向の基本概念を問う午前問題として各試験区分で繰り返し出題されています。

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

📊 過去問での出題実績

試験回 出題内容 問われたポイント
FE H30春
午前 問46
「あるクラスの属性や機能がサブクラスで利用できることを何というか」を選ぶ問題。 ・継承の一言定義を正確に知っているか
・オーバーライド・カプセル化・多態性がひっかけ選択肢
FE H23秋
午前 問46
オブジェクト指向の基本概念の組合せとして適切なものを選ぶ問題。 ・「抽象化・カプセル化・継承・クラス」の4つセットを知っているか
・「構造化」「正規化」はオブジェクト指向の概念ではない
AP H28秋
午前 問47
クラスに関する記述のうち適切なものを選ぶ問題。選択肢に「サブクラスはスーパークラスの性質を継承する」が含まれる。 ・親子関係の方向を逆にしたひっかけ(「スーパークラスがサブクラスの性質を継承する」)に注意

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

パターン1:「○○を何と呼ぶか」(用語選択型)
継承の説明文が問題文中に示され、該当する用語名を4択から選ぶ形式。ひっかけとして「カプセル化」「オーバーライド」「多態性」が並ぶ。「親クラスの属性を子クラスが引き継ぐ」という記述があれば継承を選ぶ。

 

パターン2:「クラスに関する記述で正しいものを選べ」(正誤判定型)
スーパークラスとサブクラスの関係に関する記述が4つ並び、正しいものを選ぶ形式。典型的なひっかけは親子の方向を入れ替えた選択肢(「スーパークラスがサブクラスの性質を継承する」)。方向は常に「親→子」であることを覚えておけば即答できる。

 

試験ではここまででOKです。多重継承やインタフェースの詳細まで科目Aで問われることは稀なので、深追いは不要です。


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

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


Q. オブジェクト指向における「継承」の説明として、最も適切なものはどれでしょうか?

  • A. オブジェクト内部のデータ構造や実装の詳細を外部から隠蔽し、公開されたメソッドだけを通じて操作させる仕組み。
  • B. 同じメッセージを異なるオブジェクトに送ったとき、受け手のクラスに応じて異なる処理が実行される特性。
  • C. 上位クラスで定義された属性やメソッドを、下位クラスがそのまま引き継いで利用できる仕組み。

正解と解説を見る

正解:C

解説:
継承(インヘリタンス)は、スーパークラス(親)で定義した属性やメソッドをサブクラス(子)が引き継ぎ、差分だけを追加・変更できる仕組みです。「上位クラス→下位クラスへの引き継ぎ」がキーワードになります。

選択肢Aはカプセル化(情報隠蔽)の説明です。データと手続きをまとめて内部を隠すことで、外部からは公開メソッドだけを通じて操作する仕組みを指します。選択肢Bは多態性(ポリモーフィズム)の説明です。同じメッセージでも受け手のクラスごとに処理が異なる特性であり、親子間の属性の引き継ぎとは別の概念です。


よくある質問(FAQ)

Q. 「多重継承」とは何ですか?

1つの子クラスが複数の親クラスから同時に継承することです。C++では多重継承が可能ですが、複数の親に同名メソッドがある場合に「どちらを呼び出すか」が曖昧になる問題(ダイヤモンド問題)が発生します。JavaやC#ではこの問題を避けるため、クラスの多重継承を禁止し、代わりにインタフェースを使って同等の柔軟性を確保しています。

Q. 「オーバーライド」と「オーバーロード」はどう違いますか?

オーバーライドは、親クラスで定義済みのメソッドを子クラスで再定義して動作を上書きすることです。オーバーロードは、同一クラス内で同じ名前のメソッドを引数の型や数を変えて複数定義することです。「上書き=オーバーライド」「多重定義=オーバーロード」と覚えると混同しなくなります。

Q. 実務で「継承を使いすぎるな」と言われるのはなぜですか?

継承の階層が深くなると、親クラスの変更が全子クラスに波及し、影響範囲の把握が困難になるためです。実務では「コンポジション(委譲)」、つまり他のクラスのインスタンスを内部に持たせて機能を再利用する設計が推奨される場面も多くあります。ただし、IPA試験の範囲ではこの設計判断まで問われることはないので、参考程度で構いません。