6

新しいC++11キーワードが、メソッド宣言の後に、 ?の代わりにoverride一貫した方法で強制的に表示される理由について知りたいです。constvirtual

class SomeBaseClass {
    virtual void DoPolymorphicBehavior() = 0;
    ...
class SomeDerrivedClass : public SomeBaseClass {
    void DoPolymorphicBehavior() override;
    ...

なぜ世界でそれを同じ正確な位置に(そしてその代わりに)許可しないのですか?virtual

class SomeBaseClass {
    virtual void DoPolymorphicBehavior() = 0;
    ...
class SomeDerrivedClass : public SomeBaseClass {
    override void DoPolymorphicBehavior();
    ...

これにより、派生クラスのソースファイルで検索と置換を実行して、新しいキーワードを簡単に利用できるようになり、エラーを見つける際にコンパイラの助けを得ることができました。ただし、C ++ 11は構文的に異なる位置に配置されるため、新しいコンパイラ機能を利用するには、文字通り数千行のソースコードを手動で更新する必要があります。

確かに、この選択の背後には正当な理由がありましたか?

4

3 に答える 3

10

関数名の前に表示される宣言指定子シーケンスには、識別子(たとえば、関数の戻り型)を含めることができます。いくつかの既存のコードの戻り型が次のようになっていると想像してくださいoverride

override foo();

overrideまたは:と呼ばれる変数ですら

int override;

新しいキーワードを導入すると、キーワードが予約されているために名前がoverride付けられた識別子を含む既存のコードが壊れます。override

したがって、新しいキーワードを導入する代わりに、コンテキストキーワード:(overrideおよびfinal)を導入しました。コンテキストキーワードは、構文上の位置によってキーワードとして識別されます。プログラムに識別子を呼び出しても問題ありませんoverridefinalこれらの識別子が関数宣言の引数リストの後にある場合、それらは特別な意味を持っています。

したがって、関数の引数の後に配置される理由は、新しいキーワードを導入すると古いコードが壊れ、コンパイラがoverrideここを見ると、他の識別子がここに表示されないため、その意味が正確にわかるためです。

于 2013-02-27T18:43:56.183 に答える
7

それはキーワードではなく、それがあなたの質問への答えでもあります。

これは、状況によっては特別な意味を持つ識別子です。宣言の先頭に表示することが許可されている場合、たとえば、ユーザー定義の戻りタイプ名とあいまいになる可能性があります。

于 2013-02-27T18:34:57.117 に答える
2

overridefinalはキーワードではなく、ユーザーコードに表示される可能性のある記号であるためです。(つまり、変数を持つことができます int override;。)これらは限られたコンテキストでのみ特定の意味を持ち、ユーザー定義のシンボルが表示されないコンテキストに対応するようにそれらのコンテキストを選択する必要があります。これをすぐに明確にすることも望まれていました。次のような場合:

override void DoSomething();

overrideはユーザーシンボルにすることはできません。これは、ユーザー定義のシンボルで始まり、その後に。が続くステートメントを持つことができる文法生成がないためvoidです。しかし、コンパイラがに遭遇するまで問題は明確ではなくvoid、代わりに voidユーザー定義型を使用している場合は、さらにあいまいになります。一方、関数のparameter-declaration-clauseの後、コンテキストは明確になり、コンパイラーのスキャナーはすぐに何をすべきかを認識します。

于 2013-02-27T18:47:13.580 に答える