abstract(C++ 组件扩展)

abstract 关键字声明:

  • 类型可用作基类型,但是该类型自身无法实例化。

  • 类型成员函数只能以派生类型定义。

所有平台

语法

class-declaration class-identifier abstract {}
virtual return-type member-function-identifier() abstract ;

备注

第一个示例语法声明类是抽象类。 类声明class-declaration组件可以是本机 C++ 声明(class 或 struct),或 C++ 扩展声明(ref class 或 ref struct),前提是如果 /ZW/clr 编译器选项已指定。

第二示例语法声明虚拟成员函数是抽象函数。 声明函数抽象与声明其为纯虚函数相同。 声明成员函数抽象还会导致将封闭类声明为抽象。

abstract 关键字由本机代码和特定平台代码支持;即可以通过或不通过 /ZW/clr 编译器选项进行编译。

您可以在编译时检测类型是否为通过 __is_abstract(type) 类型特征进行抽象化的类型。 有关详细信息,请参阅编译器支持类型特征(C++ 组件扩展)

abstract 关键字是一种区分上下文的重写说明符。 有关区分上下文的关键字的更多信息,请参见 上下文相关的关键字(C++ 组件扩展)。 有关重写说明符的更多信息,请参见如何在本机编译中声明重写说明符

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
};

请参见

概念

适用于运行时平台的组件扩展