abstract (C++/CLI および C++/CX)abstract (C++/CLI and C++/CX)

abstract キーワードは、次のいずれかを宣言します。The abstract keyword declares either:

  • 型を基本データ型として使用できるが、型自体はインスタンス化できない。A type can be used as a base type, but the type itself cannot be instantiated.

  • 型のメンバー関数を派生型でのみ定義できる。A type member function can be defined only in a derived type.

すべてのプラットフォームAll Platforms


class-declaration class-identifier abstract {}class-declaration class-identifier abstract {}

virtual return-type member-function-identifier () abstract ;virtual return-type member-function-identifier () abstract ;


最初の例の構文では、abstract (抽象) にするクラスを宣言します。The first example syntax declares a class to be abstract. class-declaration コンポーネントは、ネイティブ C++ 宣言 (class クラス struct) が可能です。/ZW または /clr コンパイラ オプションが指定された場合は、C++ 拡張機能宣言 (ref class または ref struct) が可能です。The class-declaration component can be either a native C++ declaration (class or struct), or a C++ extension declaration (ref class or ref struct) if the /ZW or /clr compiler option is specified.

2 つ目の例の構文では、仮想メンバー関数を抽象として宣言します。The second example syntax declares a virtual member function to be abstract. 関数を抽象として宣言することは、純粋仮想関数として宣言することと同じです。Declaring a function abstract is the same as declaring it a pure virtual function. メンバー関数を抽象として宣言すると、外側のクラスも抽象として宣言されます。Declaring a member function abstract also causes the enclosing class to be declared abstract.

abstract キーワードはネイティブ コードとプラットフォーム固有のコードでサポートされます。つまり、/ZW または /clr コンパイラ オプション を指定してもしなくてもコンパイルできます。The abstract keyword is supported in native and platform-specific code; that is, it can be compiled with or without the /ZW or /clr compiler option.

コンパイル時に、型の特徴が __is_abstract(type) である抽象型であるかどうかを検出できます。You can detect at compile time if a type is abstract with the __is_abstract(type) type trait. 詳細については、「型の特徴のコンパイラ サポート」を参照してください。For more information, see Compiler Support for Type Traits.

abstract キーワードは状況依存のオーバーライド指定子です。The abstract keyword is a context-sensitive override specifier. 状況依存キーワードの詳細については、「状況依存キーワード」を参照してください。For more information about context-sensitive keywords, see Context-Sensitive Keywords. オーバーライド指定子の詳細については、「How to:Declare Override Specifiers in Native Compilations (方法: ネイティブ コンパイルでオーバーライド指定子を宣言する)」を参照してください。For more information about override specifiers, see How to: Declare Override Specifiers in Native Compilations.

Windows ランタイムWindows Runtime

詳細については、「Ref クラスと構造体」を参照してください。For more information, see Ref classes and structs.


コンパイラ オプション: /ZWCompiler option: /ZW

共通言語ランタイムCommon Language Runtime


コンパイラ オプション: /clrCompiler option: /clr


次のコード例では、X クラスが abstract とマークされているため、エラーが生成されます。The following code example generates an error because class X is marked abstract.

// abstract_keyword.cpp
// compile with: /clr
ref class X abstract {
   virtual void f() {}

int main() {
   X ^ MyX = gcnew X;   // C3622

次のコード例では、abstract とマークされたネイティブ クラスがインスタンス化されるため、エラーが生成されます。The following code example generates an error because it instantiates a native class that is marked abstract. このエラーは /clr コンパイラ オプションの有無にかかわらず発生します。This error will occur with or without the /clr compiler option.

// abstract_keyword_2.cpp
class X abstract {
   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 とマークされているため、エラーが生成されます。The following code example generates an error because function f includes a definition but is marked abstract. この例の最後のステートメントで、抽象仮想関数を宣言することは純粋仮想関数を宣言することと同じであることを示しています。The final statement in the example shows that declaring an abstract virtual function is equivalent to declaring a pure virtual function.

// abstract_keyword_3.cpp
// compile with: /clr
ref class X {
   virtual void f() abstract {}   // C3634
   virtual void g() = 0 {}   // C3634

関連項目See also

.NET および UWP でのコンポーネント拡張Component Extensions for .NET and UWP