2009-09-18 6 views
4

J'ai remarqué qu'il y a des mots-clés scellés et d'interface en C++. Est-ce juste pour CLR C++? Si non, quand ont été scellés et l'interface ajoutée à la norme C++? Ont-ils la même signification en C++ qu'en C#? Si non, comment puis-je obtenir l'équivalent en C++ standard?C++ scellé et interface

Répondre

7

sealed et interface les mots-clés sont uniquement pour C++/CLI. Voir Language Features for Targeting the CLR pour plus de détails.

En standard, C++ interface peut être remplacé par une classe virtuelle pure et un héritage multiple. Sealed mot-clé pourrait être remplacé par boost::noninheritable (qui n'est pas une partie officielle de boost encore).

+1

Remarque: 'sealed' peut être utilisé en code C++ natif si vous souhaitez utiliser une extension MS. Merci pour le pointeur sur boost :: non-héritable. –

+0

Je ne recommanderais pas d'utiliser le mot-clé 'sealed' en C++ natif (même dans Visual C++) puisque ce mot-clé ne fait pas partie de C++ Standard. –

+0

@ Michael: Ce n'est pas natif s'il nécessite une extension. Je dirais tuo peut utiliser scellé dans le code MS C++/CLI. Ce qui n'est pas tout à fait le même que C++. –

5

Un interface peut être dupliqué en C++ avec une classe virtuelle pure, en profitant du fait que vous pouvez faire plusieurs héritages.

sealed peut être ailé avec un constructeur privé et une sorte de modèle d'usine (pour obtenir réellement des instances de la classe scellée). Il y a quelques autres exemples à the C++ FAQ Lite.

+0

comment peut-on dupliquer scellé en C++ (C++ standard) , y a-t-il un moyen? – Tom

+0

par la plupart des définitions, un mixin implémente un certain comportement à ajouter à une classe, et n'est pas une interface. –

+0

@Pete: merci de le signaler. Actualisé. –

0

__interface est valide dans Visual C++ à partir de VS 2005. Il fournit une validation à la compilation supplémentaire que l'interface ressemble et sent comme on devrait. (L'article MSDN lié contient tous les détails.)

__sealed, semble toutefois faire partie des «extensions managées pour C++».

+0

'__interface' et' __sealed' sont issus de l'ancienne syntaxe. Vous ne devriez pas les utiliser. –

+0

'__sealed' est vieux, oui. Mais '__interface'? A-t-il été remplacé par quoi que ce soit dans le monde non géré? – reuben

+0

Désolé, __interface est toujours utilisé pour les interfaces non gérées. Jamais utilisé :) Mais ce n'est pas lié à C++/CLI et ce n'est pas la norme C++. Dans le monde géré, on devrait utiliser 'sealed' et' interface', sans traits de soulignement. –

4

interface et sealed ont été ajoutés par MS pour l'implémentation C++/CLI. Cependant, les versions actuelles du compilateur Microsoft font aussi support the sealed keyword for native code - mais c'est une extension que vous ne trouverez probablement jamais ailleurs. Notez que MS a fait quelque chose de similaire avec override - c'est une extension de mot clé dans MSVC qui indique qu'une fonction est destinée à remplacer une fonction virtuelle de classe de base (le compilateur se plaindra si cela ne s'avère pas être le cas). Pour une raison quelconque, Microsoft n'a pas fait la même chose pour le mot-clé interface, mais ils ont l'extension de mot-clé __interface qui fait ce que vous attendez. Je soupçonne qu'ils n'ont pas ajouté une extension de mot clé native interface parce que l'identificateur interface se trouve dans beaucoup de code existant (peut-être comme une macro qui se résout à class) - mais c'est juste une supposition de ma part.

Un autre facteur pourquoi __interface a les underscores en sealed et override ne pourrait être pas parce que ces derniers sont "context-sensitive keywords" - une technologie qui MS introduit en C++/CLI qui fait des mots-clés identificateurs que dans certains contextes de grammaire - si sealed et override peuvent toujours être utilisés comme noms de variables ou de fonctions, même s'ils sont également utilisés comme mots-clés. Le compilateur peut déterminer à partir du contexte quelle utilisation est appropriée. Peut-être qu'ils ne pouvaient pas s'en tirer avec ça pour interface.

Quoi qu'il en soit vous pouvez peut-être obtenir le meilleur des deux mondes avec quelque chose comme:

#if _MSC_VER >= 1400 
#define OVERRIDE override 
#define SEALED sealed 
#define INTERFACE __interface 
#else 
#define OVERRIDE 
#define SEALED 
#define INTERFACE class 
#endif 

que je blatently volé:

+0

+1 pour m'avoir aidé à comprendre pourquoi mon code C++/CLI utilisant 'interface' comme identifiant ne compilait pas. C'était en effet une macro. Mettez dans une interface '#undef 'et bien sûr, il a bien compilé. – Kevin

1

sealed et interface ne sont pas en Normes C++. Cependant, C++ 11 ajoute un mot-clé final contextuelle avec la même sémantique que mot-clé sealed Microsoft:

// '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 { }; 

Avec une macro-abstraction mineure pour la portabilité, je ne vois pas de raison de ne pas utiliser sealed aujourd'hui, si c'est utile et vous compilez régulièrement avec un compilateur qui le supporte (ou son synonyme normalisé final).

Questions connexes