我注意到 C++ 中有密封和接口关键字。这仅适用于 CLR C++ 吗?如果没有,什么时候密封和接口被添加到 C++ 标准中?它们在 C++ 中的含义与在 C# 中的含义相同吗?如果不是,我如何获得标准 C++ 中的等价物?
5 回答
sealed
和interface
关键字仅适用于 C++/CLI。有关更多详细信息,请参阅针对 CLR 的语言功能。
在标准 C++interface
中,可以用纯虚拟类和多重继承代替。Sealed
关键字可以替换为boost::noninheritable
(这还不是 boost 的官方部分)。
Aninterface
可以在 C++ 中使用纯虚拟类复制,利用您可以进行多重继承的事实。
sealed
可以使用私有构造函数和一种工厂模式(以实际获取密封类的实例)。C++ FAQ Lite中还有几个其他示例。
interface
并由sealed
MS 添加用于 C++/CLI 实现。但是,当前版本的 Microsoft 编译器也确实支持sealed
native code 的关键字- 但这是您可能永远无法在其他地方找到的扩展。
请注意,MS 已经做了类似的事情override
- 它是 MSVC 中的关键字扩展,表示函数旨在覆盖基类虚函数(如果事实并非如此,编译器会抱怨)。
出于某种原因,微软没有对interface
关键字做同样的事情,但他们确实有__interface
关键字扩展,可以满足您的期望。我怀疑他们没有添加本机interface
关键字扩展,因为interface
在许多现有代码中都可以找到标识符(可能作为解析为的宏class
)-但这只是我的猜测。
__interface
为什么有下划线而sealed
没有override
下划线的另一个因素可能是因为后者是“上下文敏感关键字” ——MS 在 C++/CLI 中引入的一种技术,它使某些标识符仅在某些语法上下文中成为关键字——所以sealed
并且override
仍然可以用作变量或函数名称,即使它们也用作关键字。编译器可以根据上下文确定哪种使用是合适的。也许他们无法逃脱惩罚interface
。
无论如何,您可以通过以下方式获得两全其美:
#if _MSC_VER >= 1400
#define OVERRIDE override
#define SEALED sealed
#define INTERFACE __interface
#else
#define OVERRIDE
#define SEALED
#define INTERFACE class
#endif
我公然偷了:
sealed
并且interface
不在 C++ 标准中。但是,C++11 添加了一个final
与微软关键字语义相同的上下文sealed
关键字:
// 'final' works on methods.
class Base
{
public:
virtual void foo() final { }
};
// This is an error in C++11:
class Derived1 : public Base
{
public:
// Error: Base's foo is final
virtual void foo() { }
};
// 'final' also works on individual virtual methods.
class FinalBase final { };
// This is an error in C++11:
class Derived2 : public FinalBase { };
对于可移植性的一些次要宏抽象sealed
,如果它有帮助并且您使用支持它的编译器(或其标准化final
同义词)定期编译,我认为没有理由不使用它。
__interface
自 VS 2005 起在 Visual C++ 中有效。它提供了额外的编译时验证,界面看起来和闻起来都应该。(链接的 MSDN 文章有完整的细节。)
__sealed
但是,它似乎只是“C++ 托管扩展”的一部分。