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