C++ には、sealed キーワードと interface キーワードがあることに気付きました。これは CLR C++ 専用ですか? そうでない場合、C++ 標準に封印され、インターフェイスが追加されたのはいつですか? C# と同じ意味を C++ でも持っていますか? そうでない場合、標準 C++ で同等のものを取得するにはどうすればよいですか?
5 に答える
sealedandinterfaceキーワードは C++/CLI 専用です。詳細については、「CLRを対象とする言語機能」を参照してください。
標準 C++ ではinterface、純粋仮想クラスと多重継承に置き換えることができます。Sealedキーワードを置き換えることができますboost::noninheritable(これはまだブーストの公式部分ではありません)。
Aninterfaceは、多重継承ができるという事実を利用して、純粋仮想クラスを使用して C++ で複製できます。
sealedプライベート コンストラクターと一種のファクトリ パターンを使用してウィングすることができます (実際にシール クラスのインスタンスを取得するため)。C++ FAQ Lite には、他にもいくつかの例があります。
interfaceC++/CLI 実装のためにsealedMS によって追加されました。ただし、Microsoft コンパイラの現在のバージョンでは、ネイティブ コードのキーワードもサポートsealedされていますが、これは他の場所では決して見られない拡張機能です。
MS も同様のことを行っていることに注意してください。これoverrideは、関数が基本クラスの仮想関数をオーバーライドすることを意図していることを示す MSVC のキーワード拡張です (そうでないことが判明した場合、コンパイラは文句を言います)。
何らかの理由で、Microsoft はキーワードに対して同じことをしませんでしたが、期待どおりの機能をinterface果たすキーワード拡張子を持っています。__interface識別子が多くの既存のコードで見つかっているinterfaceため(おそらく. interfaceclass
__interfaceアンダースコアがありsealed、overrideない理由のもう 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
私が露骨に盗んだもの:
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同義語) で定期的にコンパイルする場合です。
__interfaceVS 2005 の時点で Visual C++ で有効です。インターフェイスが本来あるべきように見え、匂いがすることをコンパイル時に検証します。(リンクされた MSDN の記事に詳細が記載されています。)
__sealedただし、「Managed Extensions for C++」の一部にすぎないようです。