4

C++ には、sealed キーワードと interface キーワードがあることに気付きました。これは CLR C++ 専用ですか? そうでない場合、C++ 標準に封印され、インターフェイスが追加されたのはいつですか? C# と同じ意味を C++ でも持っていますか? そうでない場合、標準 C++ で同等のものを取得するにはどうすればよいですか?

4

5 に答える 5

7

sealedandinterfaceキーワードは C++/CLI 専用です。詳細については、「CLRを対象とする言語機能」を参照してください。

標準 C++ ではinterface、純粋仮想クラスと多重継承に置き換えることができます。Sealedキーワードを置き換えることができますboost::noninheritable(これはまだブーストの公式部分ではありません)。

于 2009-09-18T16:41:46.327 に答える
5

Aninterfaceは、多重継承ができるという事実を利用して、純粋仮想クラスを使用して C++ で複製できます。

sealedプライベート コンストラクターと一種のファクトリ パターンを使用してウィングすることができます (実際にシール クラスのインスタンスを取得するため)。C++ FAQ Lite には、他にもいくつかの例があります。

于 2009-09-18T16:44:24.737 に答える
4

interfaceC++/CLI 実装のためにsealedMS によって追加されました。ただし、Microsoft コンパイラの現在のバージョンでは、ネイティブ コードのキーワードもサポートsealedされていますが、これは他の場所では決して見られない拡張機能です。

MS も同様のことを行っていることに注意してください。これoverrideは、関数が基本クラスの仮想関数をオーバーライドすることを意図していることを示す MSVC のキーワード拡張です (そうでないことが判明した場合、コンパイラは文句を言います)。

何らかの理由で、Microsoft はキーワードに対して同じことをしませんでしたが、期待どおりの機能をinterface果たすキーワード拡張子を持っています。__interface識別子が多くの既存のコードで見つかっているinterfaceため(おそらく. interfaceclass

__interfaceアンダースコアがありsealedoverrideない理由のもう 1 つの要因は、後者が「コンテキスト依存のキーワード」であるためである可能性があります。これは、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

sealedinterfaceC++ 標準にはありません。ただし、C++11 では、 Microsoft のキーワード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

__interfaceVS 2005 の時点で Visual C++ で有効です。インターフェイスが本来あるべきように見え、匂いがすることをコンパイル時に検証します。(リンクされた MSDN の記事に詳細が記載されています。)

__sealedただし、「Managed Extensions for C++」の一部にすぎないようです。

于 2009-09-18T16:45:11.453 に答える