web-dev-qa-db-ja.com

C ++の 'override'キーワードは何のために使用されますか?

私はC++の初心者です。作業中のヘッダーファイルで使用されているoverrideキーワードが見つかりました。私は知っているかもしれませんが、おそらくoverrideの実際の使用法は何でしょうか、おそらく例を挙げれば理解するのは簡単でしょう。

163

overrideキーワードは、2つの目的に役立ちます。

  1. コードの読者に、「これは仮想メソッドであり、基本クラスの仮想メソッドをオーバーライドしている」と書かれています。
  2. また、コンパイラはそれがオーバーライドであることを認識しているので、オーバーライドであると思われる新しいメソッドを変更または追加していないことを「確認」できます。

後者を説明すると:

class base
{
  public:
    virtual int foo(float x) = 0; 
};


class derived: public base
{
   public:
     int foo(float x) override { ... do stuff with x and such ... }
}

class derived2: public base
{
   public:
     int foo(int x) override { ... } 
};

derived2では、コンパイラは "型の変更"に対してエラーを発行します。 overrideがなければ、せいぜいコンパイラは「あなたは仮想メソッドを同じ名前で隠しています」という警告を出します。

264
Mats Petersson

そして、すべての答えの補足として、FYI:overrideはキーワードではなく、特殊のようなものです。識別子!それは仮想関数を宣言/定義するという文脈でのみ意味を持ち、他の文脈ではそれは単なる序数識別子です。詳細については、The Standardの2.11.2を読んでください。

// kate: hl C++11;
#include <iostream>

struct base
{
    virtual void foo() = 0;
};

struct derived : base
{
    virtual void foo() override
    {
        std::cout << __PRETTY_FUNCTION__ << std::endl;
    }
};

int main()
{
    base* override = new derived();
    override->foo();
    return 0;
}

出力:

zaufi@gentop /work/tests $ g++ -std=c++11 -o override-test override-test.cc
zaufi@gentop /work/tests $ ./override-test
virtual void derived::foo()
58
zaufi

overrideはC++ 11のキーワードです。つまり、メソッドは基本クラスのメソッドからの「オーバーライド」です。この例を考えてください。

   class Foo
   {
   public:
        virtual void func1();
   }

   class Bar : public Foo
   {
   public:
        void func1() override;
   }

B::func1()A::func1()と等しくない場合、B::func1()A::func1()をオーバーライドしないため、コンパイルエラーが発生します。代わりに、func1()という新しいメソッドを定義します。

8
xorguy

ウィキペディアによると:

オブジェクト指向プログラミングにおけるメソッドのオーバーライドは、サブクラスまたは子クラスが、そのスーパークラスまたは親クラスの1つによってすでに提供されているメソッドの特定の実装を提供できるようにする言語機能です。

詳しくは、void hello()関数を持つオブジェクトfooがあるとします。

class foo {
    virtual void hello(); // Code : printf("Hello!");
}

Fooの子は、hello()関数も持ちます。

class bar : foo {
    // no functions in here but yet, you can call
    // bar.hello()
}

ただし、「Hello Bar!」を印刷することができます。 hello()関数がバーオブジェクトから呼び出されているとき。オーバーライドを使ってこれを行うことができます

class bar : foo {
    virtual void hello() override; // Code : printf("Hello Bar!");
}
1