4

我注意到 C++ 中有密封和接口关键字。这仅适用于 CLR C++ 吗?如果没有,什么时候密封和接口被添加到 C++ 标准中?它们在 C++ 中的含义与在 C# 中的含义相同吗?如果不是,我如何获得标准 C++ 中的等价物?

4

5 回答 5

7

sealedinterface关键字仅适用于 C++/CLI。有关更多详细信息,请参阅针对 CLR 的语言功能。

在标准 C++interface中,可以用纯虚拟类和多重继承代替。Sealed关键字可以替换为boost::noninheritable(这还不是 boost 的官方部分)。

于 2009-09-18T16:41:46.327 回答
5

Aninterface可以在 C++ 中使用纯虚拟类复制,利用您可以进行多重继承的事实。

sealed可以使用私有构造函数和一种工厂模式(以实际获取密封类的实例)。C++ FAQ Lite中还有几个其他示例。

于 2009-09-18T16:44:24.737 回答
4

interface并由sealedMS 添加用于 C++/CLI 实现。但是,当前版本的 Microsoft 编译器也确实支持sealednative 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

我公然偷了:

于 2009-09-18T17:34:39.677 回答
1

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同义词)定期编译,我认为没有理由不使用它。

于 2011-11-21T17:55:13.967 回答
0

__interface自 VS 2005 起在 Visual C++ 中有效。它提供了额外的编译时验证,界面看起来和闻起来都应该。(链接的 MSDN 文章有完整的细节。)

__sealed但是,它似乎只是“C++ 托管扩展”的一部分。

于 2009-09-18T16:45:11.453 回答