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