2017-11-02 4 views
7

私はいつもoverridefinalは、メンバー関数宣言子の後でなければならなぜ意思決定、について不思議に思っていました:私にとって関数宣言子の後に "override/final"を配置する必要があるのはなぜですか?

struct Base { 
    virtual void virtFun(); 
}; 
struct Foo: Base { 
    virtual void virtFun() override; 
}; 

virtualの代わりにoverride/finalを置くために、より論理的な次のようになります。

struct Base { 
    virtual void virtFun(); 
}; 
struct Foo: Base { 
    override void virtFun(); 
}; 

これには理由がありますか?たぶんpre C++ 11との互換性の問題?

+0

'virtual void virtFun()override'も書くことができます – Justin

+0

「オーバーライド」は新しいキーワードであるため、技術的な理由は考えられません。誰が "オーバーライド"キーワードを考えていたかは、それがどこに属しているか、完全に任意であると判断しました。特別な理由はありません。 –

+0

'' virtual void virtFun()override 'の@Justinの2つの指定子は、 'override'はメソッドが' virtual'を意味するので冗長です。 – VTT

答えて

18

overridefinalkeywordsではありません。

代わりに特別な識別子です。あなたが実際にそれらの名前の変数、関数またはタイプ名(タイプエイリアスまたはクラス)を宣言することができることを意味し

非常に小さなコンテキストではメンバー関数修飾子のようにしか使用できません。コンテキストをソースを解析する際にコンパイラが事前に知っておく必要があります。関数宣言の後にそれらを置くことは、そのコンテキストのC++文法からあいまいさを取り除く非常に簡単な方法です。

+2

これは、 'virtual'の位置にあった場合、いくつかの問題があることを意味します:' final myFunction(); 'は' final'データ型を返す関数です。少なくとも、その位置で 'final' /' override'を許すと、文法は複雑になりますが、あいまいになる可能性があります。 – Justin

+0

答えをありがとう!しかし、彼らは仮想の場所で特別な識別子であった可能性がありますか?そうではありませんか?そこにはタイプしかありません。それは難しいとは思われません。これにより、これらの名前で変数、関数を指定することはできますが、型だけを指定することはできません。 – geza

+0

@geza問題は、これらの名前をタイプ名にも使用できることです。あなたは 'override'という名前で*クラス*を定義することさえできます。特定のカテゴリの識別子に特定の名前を付けることは、ウサギの穴の下で非常に滑りやすい斜面です。 –

関連する問題