已密封(C++ 组件扩展)
sealed 是 ref 类的上下文相关关键字,它指示某个虚拟成员不能被替代,或某个类型不能用作基类型。
备注
ISO C++11 标准语言具有 final 关键字,它在 Visual Studio 中受到支持。在标准类上使用 final,在 ref 类上使用 sealed。
所有运行时
语法
ref class identifier sealed {...};
virtual return-type identifier() sealed {...};
参数
标识符
函数或类的名称。返回类型
函数返回的类型。
备注
在第一个语法示例中,密封了类。 在第二个示例中,密封了虚函数。
sealed 关键字对于本机目标有效,它同时对于 Windows 运行时 和公共语言运行时 (CLR) 有效。 有关详细信息,请参阅“替代说明符和本机编译”。
你可以检测到是否在编译时使用 __is_sealed (type) 类型特征密封了某个类型。 有关详细信息,请参阅编译器支持类型特征(C++ 组件扩展)。
sealed 是上下文相关的关键字。 有关详细信息,请参阅上下文相关的关键字(C++ 组件扩展)。
Windows 运行时
请参阅“Ref 类和结构”。
要求
编译器选项:/ZW
公共语言运行时
(此语言功能没有只适用于公共运行时的备注。)
要求
编译器选项:/clr
示例
下面的这个代码示例显示虚拟成员上 sealed 的效果。
// sealed_keyword.cpp
// compile with: /clr
interface struct I1 {
virtual void f();
virtual void g();
};
ref class X : I1 {
public:
virtual void f() {
System::Console::WriteLine("X::f override of I1::f");
}
virtual void g() sealed {
System::Console::WriteLine("X::f override of I1::g");
}
};
ref class Y : public X {
public:
virtual void f() override {
System::Console::WriteLine("Y::f override of I1::f");
}
/*
// the following override generates a compiler error
virtual void g() override {
System::Console::WriteLine("Y::g override of I1::g");
}
*/
};
int main() {
I1 ^ MyI = gcnew X;
MyI -> f();
MyI -> g();
I1 ^ MyI2 = gcnew Y;
MyI2 -> f();
}
输出
下一个代码示例演示如何将类标记为已密封。
// sealed_keyword_2.cpp
// compile with: /clr
interface struct I1 {
virtual void f();
};
ref class X sealed : I1 {
public:
virtual void f() override {}
};
ref class Y : public X { // C3246 base class X is sealed
public:
virtual void f() override {}
};