C++
 Computer >> コンピューター >  >> プログラミング >> C++

【C++】overrideキーワードの使い方|関数オーバーライドのミスを防ぐ方法

関数オーバーライドは、C++における最も代表的な機能の一つです。基本的に関数オーバーライドとは、基底クラスで定義された関数を、派生クラスでもう一度定義し直すことを意味します。関数のシグネチャは同一ですが、動作(振る舞い)はそれぞれ異なります。

しかし、オーバーライドの際にプログラマがミスをしてしまうケースがあります。例えば、シグネチャが一致していない場合、その関数はオーバーライドしたメソッドとしてではなく、まったく別の新しい関数として扱われてしまいます。こうしたミスを防ぐために活用できるのがoverrideキーワードです。このキーワードはC++11で導入されました。コンパイラはこのキーワードを検出すると、その関数が基底クラスの仮想関数を正しくオーバーライドしているかどうかをチェックし、オーバーライドできていなければコンパイルエラーを報告してくれます。

それでは、具体例を見ながらこの概念を確認していきましょう。

例1:シグネチャが一致する正常なオーバーライド

#include <iostream>
using namespace std;
class BaseClass{
    public:
       virtual void display() {
          cout << "Displaying from Base Class\n";
       }
};
class DerivedClass : public BaseClass{
    public:
       void display() {
          cout << "Displaying from Derived Class\n";
       }
};
main() {
    BaseClass *b_ptr;
    b_ptr = new DerivedClass();
    b_ptr->display();
}

実行結果

Displaying from Derived Class

この例では、基底クラスと派生クラスの関数シグネチャが同一であるため、プログラムは正常に動作し、多態性(ポリモーフィズム)によって派生クラス側のdisplay()が呼び出されます。

続いて、シグネチャをあえて変更した例を見てみましょう。overrideキーワードが付いているため、コンパイル時にエラーが発生します。

例2:シグネチャ不一致によるコンパイルエラー

#include <iostream>
using namespace std;
class BaseClass{
    public:
       virtual void display() {
          cout << "Displaying from Base Class\n";
       }
};
class DerivedClass : public BaseClass{
    public:
       void display(int x) override{
          cout << "Displaying from Derived Class\n";
       }
};
main() {
    BaseClass *b_ptr;
    b_ptr = new DerivedClass();
    b_ptr->display();
}

実行結果

[Error] 'void DerivedClass::display(int)' marked override, but does not override

このように、派生クラスのdisplay(int x)は引数の数が異なるためオーバーライドとは見なされず、overrideキーワードを付けていることで、コンパイラが即座にエラーを検出してくれます。

もしoverrideキーワードがなければ、display(int x)は単なる別の関数(オーバーロード)として扱われ、b_ptr->display()の呼び出しは基底クラスのdisplay()を実行してしまい、意図しない動作につながる恐れがあります。

C++11以降では、仮想関数をオーバーライドする際に必ずoverrideキーワードを付けることがベストプラクティスとされています。これにより、オーバーライド漏れやシグネチャの書き間違いといったヒューマンエラーをコンパイル段階で防止でき、より安全で保守性の高いコードを書くことができます。

  1. 【C++入門】多重継承の基本と実装方法をわかりやすく解説

    多重継承(Multiple Inheritance)とは多重継承とは、ひとつのクラスが複数の基底クラス(親クラス)から派生する仕組みのことです。多重継承を利用することで、派生クラスは複数の基底クラスが持つ機能やデータメンバをまとめて引き継ぐことができます。これはC++に代表されるオブジェクト指向プログラミング言語における重要な機能のひとつです。多重継承の構造を表した図が以下になります。C++で多重継承を実装するサンプルプログラムここでは、C++で多重継承を実装したサンプルプログラムを紹介します。クラスCが、クラスAとクラスBの2つのクラスを同時に継承する例です。サンプルコード#include

  2. C#のstaticキーワードとは?静的メンバーの基本と使い方を実例で解説

    C#では、staticキーワードを使用することで、クラスのメンバーを静的(スタティック)として定義できます。クラスのメンバーをstaticとして宣言すると、そのクラスのオブジェクトをいくつ生成しても、静的メンバーのコピーはメモリ上に1つだけしか存在しないことになります。つまり、staticキーワードは「そのメンバーがクラスに対して1つのインスタンスのみを持つ」ことを意味します。すべてのオブジェクトがこの唯一のコピーを共有するため、静的変数は値が共通して扱われる定数の定義などに適しています。また、静的メンバーにはクラス名を介して直接アクセスできるため、インスタンスを生成する必要がありません。静的