カテゴリ: C# 更新日: 2026/02/03

C#のオーバーライド(override)の基本と使い方を解説

C#のオーバーライド(override)の基本と使い方を解説
C#のオーバーライド(override)の基本と使い方を解説

先生と生徒の会話形式で理解しよう

生徒

「C#で親クラスの動きを変更したいときってどうするんですか?」

先生

「C#ではoverride(オーバーライド)という機能を使って、親クラスのメソッドの動きを子クラスで書きかえることができますよ。」

生徒

「へぇ〜、それってどういうときに使うんですか?」

先生

「では、オーバーライドの基本的な使い方を分かりやすく説明していきましょう!」

1. override(オーバーライド)とは?

1. override(オーバーライド)とは?
1. override(オーバーライド)とは?

オーバーライド(override)とは、C#で親クラスの機能(メソッドなど)を子クラスで書きかえる(上書きする)ための仕組みです。

たとえば、動物(Animal)という親クラスが「鳴く(MakeSound)」という動きを持っていて、それを犬(Dog)という子クラスでは「ワンワン」と鳴かせたいとき、overrideを使います。

このように、親クラスの共通の機能を、子クラスごとに違う動きにしたいときに使います。

2. オーバーライドの基本的な書き方

2. オーバーライドの基本的な書き方
2. オーバーライドの基本的な書き方

まずはオーバーライドの構文を確認しましょう。virtualoverrideというキーワードを使います。

  • virtual:親クラスで「このメソッドは子クラスでオーバーライドできますよ」と宣言するキーワード
  • override:子クラスで親のメソッドを上書きするときに使うキーワード

以下が基本的な例です。


class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("何かの動物が鳴いています。");
    }
}

class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("ワンワン!");
    }
}

3. 実行結果を確認しよう

3. 実行結果を確認しよう
3. 実行結果を確認しよう

次に、上記のコードを使って、実際にオーバーライドがどのように動くのか確認してみましょう。


Animal myAnimal = new Animal();
myAnimal.MakeSound();  // 親クラスのメソッド

Dog myDog = new Dog();
myDog.MakeSound();     // 子クラスでオーバーライドされたメソッド

このコードを実行すると、以下のような出力になります。


何かの動物が鳴いています。
ワンワン!

親クラスのインスタンスでは元のMakeSound()が実行され、子クラスのインスタンスではoverrideされた内容が実行されているのがわかります。

4. オーバーライドを使うメリットとは?

4. オーバーライドを使うメリットとは?
4. オーバーライドを使うメリットとは?

overrideを使うことで、共通のルール(親クラス)を持ちながら、子クラスごとに違う動作をさせることができます。

たとえば、ゲームを作る場合に「キャラクター」という親クラスがいて、「攻撃する」動作を、それぞれ「戦士」「魔法使い」「弓使い」などで違う方法にしたいときに便利です。

このように、オブジェクト指向の考え方を活かした設計ができるようになります。

5. baseキーワードを使って親の動作も残す

5. baseキーワードを使って親の動作も残す
5. baseキーワードを使って親の動作も残す

子クラスでオーバーライドするだけでなく、親クラスの動作も活かしたい場合はbaseキーワードを使います。

以下はその例です。


class Cat : Animal
{
    public override void MakeSound()
    {
        base.MakeSound(); // 親の動作も実行
        Console.WriteLine("ニャーニャー!");
    }
}

このようにbase.MakeSound()と書くことで、親クラスのメソッドも呼び出してから、追加で子クラス独自の動作を加えることができます。

6. virtual/overrideが必要な理由

6. virtual/overrideが必要な理由
6. virtual/overrideが必要な理由

なぜ親クラスにvirtual、子クラスにoverrideが必要なのでしょうか?

それは、安全性を保つためです。C#では、親クラスがvirtualをつけない限り、子クラスが勝手に上書き(オーバーライド)できないようになっています。

これにより、プログラムの構造が意図しない形で壊れるのを防いでくれます。

7. overrideとnewの違いに注意

7. overrideとnewの違いに注意
7. overrideとnewの違いに注意

子クラスで親と同じ名前のメソッドを定義するとき、overrideの代わりにnewを使うこともできますが、意味が異なります。

overrideは「親の動作を上書き」、newは「別のメソッドとして扱う」です。

間違えてoverrideと書かないと、意図した動作にならないことがあります。

まとめ

まとめ
まとめ

C#のoverride(オーバーライド)機能を学ぶことは、オブジェクト指向プログラミングを理解するうえでとても重要な一歩です。特に、親クラスのメソッドを子クラスで書き換えたい場面や、共通の基準を持ちつつ、それぞれのクラスで異なる処理を実現したいときに欠かせない仕組みです。この記事では、virtualキーワードで親クラスにオーバーライドの許可を出し、子クラスではoverrideキーワードを使って自由に振る舞いを上書きできるという流れを押さえました。

また、baseキーワードを使うことで、親クラスの処理を引き継ぎながら拡張する書き方も紹介しました。これは現実のプログラム開発でもよく使われるテクニックです。オーバーライドを活用することで、メソッドの再利用性が高まり、保守性や拡張性にも優れたコードを書けるようになります。

最後に、overridenewの違いにも触れました。見た目は似ていますが、意味が大きく異なるため、意図した動作を実現するには正しいキーワードを使うことが重要です。

実践:複数クラスを継承したオーバーライド例

以下のサンプルでは、動物の種類によって鳴き方を変えるオーバーライドの使い方をより実践的に確認できます。


class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("動物が鳴いています。");
    }
}

class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("ワンワン!");
    }
}

class Bird : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("ピヨピヨ!");
    }
}

class Program
{
    static void Main()
    {
        Animal[] zoo = { new Dog(), new Bird(), new Animal() };

        foreach (var animal in zoo)
        {
            animal.MakeSound();
        }
    }
}

ワンワン!
ピヨピヨ!
動物が鳴いています。

この例では、同じメソッド名でもオブジェクトの種類に応じて異なる結果が出力されていることが分かります。まさにオーバーライドの力を活かした多態性(ポリモーフィズム)の基本です。

先生と生徒の振り返り会話

生徒

「先生、今日のオーバーライドの話で、クラスごとに振る舞いを変える方法がよく分かりました!」

先生

「そうですね。特にvirtualoverrideの関係や、baseで元の処理も残せることを理解できたのは大きな収穫ですよ。」

生徒

「複数の動物クラスを配列にして、それぞれ違う鳴き方ができるのはちょっと感動しました!」

先生

「それがポリモーフィズムの魅力です。今後はもっと実践的な継承やインターフェースの使い方にも挑戦していくと、C#の力をもっと引き出せますよ。」

生徒

「はい!今日の内容を活かして、より良いクラス設計ができるように頑張ります!」

この記事を読んだ人からの質問

この記事を読んだ人からの質問
この記事を読んだ人からの質問

プログラミング初心者からのよくある疑問/質問を解決します

C#のオーバーライドとは何ですか?親クラスのメソッドを子クラスで書きかえる仕組みを初心者向けに知りたいです。

C#のオーバーライドとは、親クラスで定義されたメソッドを子クラス側で上書きして、独自の動作に変更できる仕組みです。親クラスの共通機能を子クラスごとにカスタマイズしたいときに使われます。
カテゴリの一覧へ
新着記事
New1
C#
C#のメモリ管理とガーベジコレクションの基礎を理解しよう
New2
C#
C#の参照型と値型の違いを初心者向けにやさしく解説!
New3
C#
C#のクエリ式とメソッド式の書き換え方を完全ガイド!LINQの2つの書き方をマスター
New4
C#
C#の戻り値にタプルを使う方法!複数の値を返すテクニック
人気記事
No.1
Java&Spring記事人気No1
C#
C#で文字列が数値か判定する方法を解説!char.IsDigitやTryParseの基本
No.2
Java&Spring記事人気No2
C#
C#のLINQでOrderByを使った並び替えを完全ガイド!初心者でもわかるソート方法
No.3
Java&Spring記事人気No3
C#
C#のpartialクラスとは?初心者でも理解できるクラス分割の基本
No.4
Java&Spring記事人気No4
C#
C#のrefとoutキーワードとは?引数の参照渡しを理解しよう
No.5
Java&Spring記事人気No5
COBOL
COBOLの数値データ型「PIC 9」の使い方と注意点をやさしく解説!
No.6
Java&Spring記事人気No6
C#
C#の引数と戻り値の基本!値を受け渡し・返す仕組みを理解しよう
No.7
Java&Spring記事人気No7
C#
C#のラムダ式の書き方と構文を初心者向けに完全解説
No.8
Java&Spring記事人気No8
C#
C#で型を調べる方法!GetType()・typeof演算子の違いと使い方