1. ホーム
  2. c++

[解決済み] C++の仮想関数を安全にオーバーライドする

2023-01-04 11:38:29

質問

仮想関数を持つ基底クラスがあり、派生クラスでその関数をオーバーライドしたいです。派生クラスで宣言した関数が実際にベースクラスの関数をオーバーライドしているかどうかをコンパイラにチェックさせる方法はありますか。私は、古いものをオーバーライドする代わりに、誤って新しい関数を宣言しないことを保証するいくつかのマクロか何かを追加したいと思います。

この例を見てください。

class parent {
public:
  virtual void handle_event(int something) const {
    // boring default code
  }
};

class child : public parent {
public:
  virtual void handle_event(int something) {
    // new exciting code
  }
};

int main() {
  parent *p = new child();
  p->handle_event(1);
}

ここで parent::handle_event() の代わりに child::handle_event() の代わりに呼び出されます。 const の宣言を見逃し、新しいメソッドを宣言してしまうからです。これは、関数名のタイプミスや、パラメータの型の違いなどでも起こり得ます。また、ベースクラスのインターフェースが変更され、その変更を反映するために派生クラスのどこかが更新されていない場合にも容易に起こり得ます。

この問題を回避する方法はありますか、どうにかしてコンパイラーまたは他のツールにこれをチェックするように指示することはできますか。役に立つコンパイラー フラグ (できれば g++ 用) があれば教えてください。これらの問題をどのように回避していますか。

どのように解決するのですか?

g++ 4.7 からは、新しい C++11 を理解します。 override キーワードを理解します。

class child : public parent {
    public:
      // force handle_event to override a existing function in parent
      // error out if the function with the correct signature does not exist
      void handle_event(int something) override;
};