1. ホーム
  2. c++

[解決済み] virtual、override、またはその両方のキーワードを使用する必要がありますか?

2022-05-03 19:24:29

質問

ここ数週間、私の頭を悩ませていることがあります。 virtualoverride . 仮想関数で継承を行う場合は、仮想関数内に virtual で、コンパイラに正しい関数を検索するように知らせるのです。 その後、c++ 11には新しいキーワードがあることも知りました。 override . 今、私は少し混乱しています。 それとも、どちらか一方だけで良いのでしょうか?

自分自身を説明するために - 私が何を意味するのかのコード例。

class Base
{
public:
    virtual void print() const = 0;
    virtual void printthat() const = 0;
    virtual void printit() const = 0;
};

class inhert : public Base
{
public:
    // only virtual keyword for overriding.
    virtual void print() const {}

    // only override keyword for overriding.
    void printthat() const override {}

    // using both virtual and override keywords for overriding.
    virtual void printit() const override {}
};

最適な方法は?

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

関数をオーバーライドする場合、技術的には以下のどちらかを記述する必要はありません。 virtual または override .

元の基底クラス宣言には、キーワード virtual を使用して、仮想であることを示します。

派生クラスでは、ベースクラスの関数と同じ型にすることで、関数を仮想化します。

ただし override は、意図したオーバーライドが技術的にオーバーライドでない場合にコンパイルエラーを発生させ、バグを回避するのに役立ちます。例えば、関数の型がベースクラスの関数と全く同じでない場合です。あるいは、ベースクラスのメンテナンスで関数の型が変更された場合、例えばデフォルトの引数が追加された場合などです。

同じように virtual キーワードを使用することで、その関数がさらに派生したクラスでも仮想的であることを保証し、そのようなバグをより微妙なものにすることができます。

というわけで、一般的なアドバイスとしては

  • 使用する virtual をベースクラス関数の宣言に使用します。

    これは技術的に必要です。

  • 使用方法 override (派生クラスのオーバーライドの場合のみ)。

    これはメンテナンスに役立ちます。

struct Base { virtual void foo() {} };
struct Derived: Base { void foo() override {} };

注意事項

¹ C++ は、共変量生ポインターと生参照の結果をサポートしています。共変量では、オーバーライドの型はまったく同じではありません。ただ、互換性のある型を持つだけです。