ホームページ  >  記事  >  バックエンド開発  >  C++11 の新機能 - ポリモーフィズムと仮想関数、オーバーライド指定子

C++11 の新機能 - ポリモーフィズムと仮想関数、オーバーライド指定子

php是最好的语言
php是最好的语言オリジナル
2018-08-01 14:11:432384ブラウズ

ポリモーフィズムと仮想関数

ポリモーフィズムは C の重要な機能の 1 つですが、初心者にとっては理解しにくい機能でもあります。まずは簡単な例を見てみましょう:

C++11 の新機能 - ポリモーフィズムと仮想関数、オーバーライド指定子

コードは非常に単純ですが、著者自身の言葉によれば、定義から機能までの重要なポイントを説明します。上記のコードのポリモーフィズムは次のようになります。メイン関数から始めると、これ以上単純にはなりません:

  1. #基本クラスへのポインター

  2. #派生クラスを指すオブジェクト

    派生クラスは、基本クラスで定義された仮想関数をオーバーライドします
  3. この3点は必要条件であり、そのうちの1つは必須です。

上記のコードには他にも興味深い点があり、結果には影響しませんが、理解しておくとよいでしょう。派生クラスの基本クラスの仮想関数を再定義 (オーバーライド) する場合:

  1. virtual キーワードは必要ありません

  2. #関数を public として宣言する必要はありません
  3. オーバーライドの失敗

オーバーライド仮想関数 2 つの関数の署名が一貫している必要があります。たとえば、次のコードは次のとおりです。

C++11 の新機能 - ポリモーフィズムと仮想関数、オーバーライド指定子 sub2::f1 の署名は、base::f1 の署名と一致しないため、ポリモーフィズムを実現できません。

おそらく、このエラーはあまりにも明白であり、決して起こらないと思われるかもしれません。これは、この例のメンバー関数が単純すぎるためです。実際の開発では、開発規模の拡大に伴いクラスの継承関係はますます深くなり、メンバ関数のパラメータも増加し、派生クラスで定義されたメンバ関数のシグネチャやオーバーライドに遭遇することが多くなります。オブジェクトの署名が矛盾しているため、上書きに失敗します。

そして恐ろしいことに、この種のエラーはコンパイル エラーを引き起こさず、見つけるのも簡単ではありません。

オーバーライド指定子

この問題を解決するために、C 11 でメソッドが導入されました。派生クラスでオーバーライド関数を宣言および定義するときにオーバーライド指定子を使用します。

関数の目的は明確であるため、コンパイラが基本クラス内で同じシグネチャを持つ仮想関数を見つけられない場合、コンパイル エラーが発生します。

C++11 の新機能 - ポリモーフィズムと仮想関数、オーバーライド指定子

筆者の感想

C言語自体の機能を有効活用し、自動的にエラーを検出する機会を逃さないことがCプログラマの習慣になるはずです。 。職人魂の結晶とも言えます。 関連記事:

c 11 Final およびオーバーライド指定子について詳しく説明します

auto と decltype の違いと関係C 11 の新機能

関連ビデオ:

Android6.0 の新機能

以上がC++11 の新機能 - ポリモーフィズムと仮想関数、オーバーライド指定子の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。