私はC++の初心者です。作業中のヘッダーファイルで使用されているoverride
キーワードが見つかりました。私は知っているかもしれませんが、おそらくoverride
の実際の使用法は何でしょうか、おそらく例を挙げれば理解するのは簡単でしょう。
override
キーワードは、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
がなければ、せいぜいコンパイラは「あなたは仮想メソッドを同じ名前で隠しています」という警告を出します。
そして、すべての答えの補足として、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()
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()
という新しいメソッドを定義します。
ウィキペディアによると:
オブジェクト指向プログラミングにおけるメソッドのオーバーライドは、サブクラスまたは子クラスが、そのスーパークラスまたは親クラスの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!");
}