abstract (C++ コンポーネント拡張)
abstract キーワードは、次のいずれかを宣言します。
型を基本データ型として使用できるが、型自体はインスタンス化できない。
型のメンバー関数を派生型でのみ定義できる。
すべてのプラットフォーム
構文
class-declaration class-identifier abstract {}
virtual return-type member-function-identifier() abstract ;
解説
最初の例の構文では、abstract (抽象) にするクラスを宣言します。 class-declaration コンポーネントは /ZW または /clr のコンパイラ オプションを指定すると、ネイティブ C++ の宣言 (class または struct)、または C ++.の拡張宣言になります (ref class または ref struct)。
2 つ目の例の構文では、仮想メンバー関数を抽象として宣言します。 関数を抽象として宣言することは、純粋仮想関数として宣言することと同じです。 メンバー関数を抽象として宣言すると、外側のクラスも抽象として宣言されます。
abstract キーワードはネイティブ コードおよびプラットフォーム固有のコードでサポートされます。つまり、コンパイラ オプション /ZW または /clr を指定してもしなくてもコンパイルできます。
コンパイル時に、型の特徴が __is_abstract(type) である抽象型かどうかを検出できます。 詳細については、「型の特徴のコンパイラ サポート (C++ コンポーネント拡張)」を参照してください。
abstract キーワードは状況依存のオーバーライド指定子です。 状況依存のキーワードの詳細については、「状況依存のキーワード (C++ コンポーネント拡張)」を参照してください。 オーバーライド指定子に関する詳細については、「How to: Declare Override Specifiers in Native Compilations (方法: ネイティブ コンパイルでオーバーライド指定子を宣言する)」を参照してください。
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
};