abstract (C++ コンポーネント拡張)
abstract キーワードは、次のいずれかを宣言します。
型を基本データ型として使用できるが、型自体はインスタンス化できない。
型のメンバー関数を派生型でのみ定義できる。
すべてのプラットフォーム
Syntax
class-declaration class-identifier abstract {}
virtual return-type member-function-identifier() abstract ;
解説
最初の例の構文では、abstract (抽象) にするクラスを宣言します。class-declaration コンポーネントにはネイティブ C++ の宣言 (class または struct) を指定できますが、コンパイラ オブション /ZW または /clr が指定されている場合は C++ 拡張機能の宣言 (ref class または ref struct) を指定できます。
2 つ目の例の構文では、仮想メンバー関数を抽象として宣言します。関数を抽象として宣言することは、純粋仮想関数として宣言することと同じです。メンバー関数を抽象として宣言すると、外側のクラスも抽象として宣言されます。
abstract キーワードはネイティブ コードおよびプラットフォーム固有のコードでサポートされます。つまり、コンパイラ オプション /ZW または /clr を指定してもしなくてもコンパイルできます。
コンパイル時に、型の特徴が __is_abstract(type) である抽象型かどうかを検出できます。詳細については、「型の特徴のコンパイラ サポート (C++ コンポーネント拡張)」を参照してください。
abstract キーワードは状況依存のオーバーライド指定子です。For more information about context-sensitive keywords, see 状況依存のキーワード (C++ コンポーネント拡張).オーバーライド指定子に関する詳細については、「How to: Declare Override Specifiers in Native Compilations (方法: ネイティブ コンパイルでオーバーライド指定子を宣言する)」を参照してください。
Windows ランタイム
For more information, see Ref classes and structs.
要件
Compiler option: /ZW
共通言語ランタイム
要件
Compiler option: /clr
例
Example
次のコード例では、X クラスに abstract が指定されているため、エラーが生成されます。
// abstract_keyword.cpp
// compile with: /clr
ref class X abstract {
public:
virtual void f() {}
};
int main() {
X ^ MyX = gcnew X; // C3622
}
Example
次のコード例では、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'}
Example
次のコード例では、関数 f に定義が含まれている一方で abstract が指定されているため、エラーが生成されます。この例の最後のステートメントで、抽象仮想関数を宣言することは純粋仮想関数を宣言することと同じであることを示しています。
// abstract_keyword_3.cpp
// compile with: /clr
ref class X {
public:
virtual void f() abstract {} // C3634
virtual void g() = 0 {} // C3634
};