C++ cli c++;密封和接口 < >我注意到C++中有密封的界面关键字。这是CLR C++的吗? 如果没有,何时被密封并添加到C++标准中?它们在C++中是否有相同的含义,就像在C语言中一样?如果不是,我如何得到标准C++中的等价物? < >代码>密封< /COD>和接口< /C> >关键字仅用于C++/CLI。有关更多详细信息,请参阅 标准C++中的P> >代码>接口>代码>可以用纯虚拟类和多重继承来代替。代码>密封的关键字可以被替换(这不是Boost的官方部分)。 < P> A>代码>接口< /C>可以在C++中用纯虚拟类复制,利用可以进行多重继承的事实。

C++ cli c++;密封和接口 < >我注意到C++中有密封的界面关键字。这是CLR C++的吗? 如果没有,何时被密封并添加到C++标准中?它们在C++中是否有相同的含义,就像在C语言中一样?如果不是,我如何得到标准C++中的等价物? < >代码>密封< /COD>和接口< /C> >关键字仅用于C++/CLI。有关更多详细信息,请参阅 标准C++中的P> >代码>接口>代码>可以用纯虚拟类和多重继承来代替。代码>密封的关键字可以被替换(这不是Boost的官方部分)。 < P> A>代码>接口< /C>可以在C++中用纯虚拟类复制,利用可以进行多重继承的事实。,c++-cli,sealed,C++ Cli,Sealed,sealed可以使用私有构造函数和某种工厂模式(实际获取sealed类的实例)。在Visual C++中,有两个例子,< P>在VS 2005中是有效的。它提供了额外的编译时验证,界面看起来和闻起来都应该这样。(链接的MSDN文章提供了全部详细信息。) 但是,在C++ C++实现中,只是“C++托管扩展”的一部分。不过,当前版本的Microsoft编译器也会这样做,但这是一个在其他地方可能永远找不到的扩展 请注意,MS做了一些类似于覆盖——它是MSVC中的一个关键字扩展,表示函数打算覆盖基类虚拟

sealed
可以使用私有构造函数和某种工厂模式(实际获取sealed类的实例)。在Visual C++中,有两个例子,

< P>在VS 2005中是有效的。它提供了额外的编译时验证,界面看起来和闻起来都应该这样。(链接的MSDN文章提供了全部详细信息。)


但是,在C++ C++实现中,

只是“C++托管扩展”的一部分。不过,当前版本的Microsoft编译器也会这样做,但这是一个在其他地方可能永远找不到的扩展

请注意,MS做了一些类似于覆盖——它是MSVC中的一个关键字扩展,表示函数打算覆盖基类虚拟函数(如果事实证明并非如此,编译器会投诉)

出于某种原因,Microsoft没有对
界面
关键字执行相同的操作,但它们确实具有您可能期望的关键字扩展。我怀疑他们没有添加本机的
接口
关键字扩展,因为
接口
标识符存在于许多现有代码中(可能是解析为
)但这只是我的猜测

另一个原因是
\u interface
有下划线,而
sealed
override
没有下划线,这可能是因为后者是MS在C++/CLI中引入的一种技术,它只在某些语法上下文中生成一些标识符关键字,所以
sealed
override
仍然可以使用作为变量或函数名,即使它们也用作关键字。编译器可以从上下文中确定哪个使用是合适的。也许对于
接口
,他们无法逃脱

不管怎样,您可以通过以下方式实现两全其美:

#if _MSC_VER >= 1400
#define OVERRIDE override
#define SEALED sealed
#define INTERFACE __interface
#else
#define OVERRIDE
#define SEALED
#define INTERFACE class
#endif
我明目张胆地偷了它:


<> >代码>密封< /代码>和接口< /C> >不在C++标准中。但是,C++11添加了上下文
final
关键字,其语义与Microsoft的
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 { };

对于可移植性的一些小的宏抽象,如果它有用并且您使用支持它的编译器(或其标准化的
final
同义词)定期编译,我看不到今天不使用
sealed
的理由。

\u接口
\u sealed
来自旧语法。你不应该使用它们。
\u sealed
是旧的,是的。但是
\u接口
?它是否被非托管世界中的任何东西所取代?抱歉,u接口仍然用于非托管接口。从未使用过:),但它与C++ + CLI无关,它不是C++标准。在管理世界中,应该使用密封< /COD>和接口< /C>,没有领先的分数。如何在C++中复制一个标准C++(C++),有没有办法?如果您愿意使用MS扩展,请注意:<代码>密封可以用于本机C++代码。感谢指针:Boosix:Actudio。我不建议在原生C++中使用<代码>密封< /COD>关键字(即使在Visual C++中),因为这个关键字不是C++标准的一部分。@米迦勒:如果它需要扩展,它不是原生的。我想说,tuo可以使用密封的MS C++/CLI代码。这与C++不完全相同。@马丁-“原生”意思是x86 /x64目标,而不是.NET目标。有很多扩展应用到非.NET C++程序(甚至在非Windows平台或非MS编译器上)。GCC有很多自己的扩展。我同意(并指出)这是一个非标准的关键字,但专门使用MSVC的人可能会发现其中的价值,正如他们可能会在GCC中发现
\uu declspec
有用或
typeof
一样。正如所指出的那样,
接口
行为可以通过
纯虚拟函数
来实现,同样,为了实现
密封
特别是为了避免继承,C++11引入了
final
关键字+1来帮助我弄清楚为什么我的C++/CLI代码使用
interface
作为标识符时没有编译。这确实是一个宏观问题。放入一个
#unde接口
,确保编译良好。