abstract (C++/CLI および C++/CX)
abstract キーワードは、次のいずれかを宣言します。
型を基本データ型として使用できるが、型自体はインスタンス化できない。
型のメンバー関数を派生型でのみ定義できる。
すべてのプラットフォーム
構文
class-declaration class-identifier abstract {}
virtual
return-type member-function-identifier () abstract ;
解説
最初の例の構文では、abstract (抽象) にするクラスを宣言します。 クラス宣言コンポーネントは、ネイティブ C++ 宣言 (class
またはstruct
)、または C++ 拡張宣言 (ref クラスまたは ref 構造体) (/ZW
または /clr
コンパイラ オプションが指定されている場合) のいずれかになります。
2 つ目の例の構文では、仮想メンバー関数を抽象として宣言します。 関数を抽象として宣言することは、純粋仮想関数として宣言することと同じです。 メンバー関数を抽象として宣言すると、外側のクラスも抽象として宣言されます。
abstract キーワードはネイティブ コードとプラットフォーム固有のコードでサポートされます。つまり、/ZW
または /clr
コンパイラ オプション を指定してもしなくてもコンパイルできます。
コンパイル時に、型の特徴が __is_abstract(type)
である抽象型であるかどうかを検出できます。 詳細については、「型の特徴のコンパイラ サポート」を参照してください。
abstract キーワードは状況依存のオーバーライド指定子です。 状況依存キーワードの詳細については、「状況依存キーワード」を参照してください。 オーバーライド指定子の詳細については、「方法: ネイティブ コンパイルでオーバーライド指定子を宣言する」を参照してください。
Windows ランタイム
詳細については、「Ref クラスと構造体」を参照してください。
要件
コンパイラ オプション: /ZW
共通言語ランタイム
要件
コンパイラ オプション: /clr
例
次のコード例では、X
クラスが abstract とマークされているため、エラーが生成されます。
// abstract_keyword.cpp
// compile with: /clr
ref class X abstract {
public:
virtual void f() {}
};
int main() {
X ^ MyX = gcnew X; // C3622
}
次のコード例では、abstract とマークされたネイティブ クラスがインスタンス化されるため、エラーが生成されます。 このエラーは /clr
コンパイラ オプションの有無にかかわらず発生します。
// abstract_keyword_2.cpp
class X abstract {
public:
virtual void f() {}
};
int main() {
X * MyX = new X; // C3622: 'X': a class declared as 'abstract'
// cannot be instantiated. See declaration of 'X'}
次のコード例では、関数 f
に定義が含まれていますが、abstract とマークされているため、エラーが生成されます。 この例の最後のステートメントで、抽象仮想関数を宣言することは純粋仮想関数を宣言することと同じであることを示しています。
// abstract_keyword_3.cpp
// compile with: /clr
ref class X {
public:
virtual void f() abstract {} // C3634
virtual void g() = 0 {} // C3634
};