virtual
戻り値型の前または後の関数宣言にキーワードを配置するかどうかに違いはありますか?
virtual void DoSomething() = 0;
void virtual DoSomething() = 0;
いくつかのレガシーコードをリファクタリングしているときに構文を見つけ、void virtual
それがまったくコンパイルされているのではないかと思っていました...
virtual
戻り値型の前または後の関数宣言にキーワードを配置するかどうかに違いはありますか?
virtual void DoSomething() = 0;
void virtual DoSomething() = 0;
いくつかのレガシーコードをリファクタリングしているときに構文を見つけ、void virtual
それがまったくコンパイルされているのではないかと思っていました...
どちらのステートメントも同等です。
しかし、最初のものはより一般的です。なぜなら、一般的に 必須フィールドは、どの構文(つまり、例の関数プロトタイプ)に最も近い状態に保たれているからです。
virtual
オプションのキーワードです(ただし、純粋な場合は必要virtual
です)。ただし、return type(ここvoid
)は必須のキーワードであり、常に必須です。したがって、人々virtual
は左端に留まり、return
タイプは関数のシグネチャに少し近づきます。
別の例:一般的に、以下のコードでは、同じ理由で1番目の構文の方が一般的であることがわかります。
const int i = 0; // 1
int const i = 0; // 2
2つの間に違いはありません。C++文法では、仮想キーワードをリターンタイプの前後の両方に表示できます。宣言の最初に配置するのが一般的な方法です。
どちらの形式も機能しますが、標準では最初の形式が指定されています。
参照:
C ++037.1指定子
宣言で使用できる指定子は次のとおりです。
decl-specifier:
storage-class-specifier
type-specifier
function-specifier
friend
typedef
decl-specifier-seq:
decl-specifier-seqopt decl-specifier
そしてさらにfunction-specifier
説明されている、
7.1.2関数指定子
関数指定子は、関数宣言でのみ使用できます。
function-specifier:
inline
virtual
explicit
今テスト済み:
両方の方法でコンパイルします。
通常、仮想はリターンタイプの前に置かれます。
詳細はこちら: http: //msdn.microsoft.com/en-us/library/0y01k918%28v=vs.80%29.aspx