C ++ запечатан и интерфейс - PullRequest
       46

C ++ запечатан и интерфейс

4 голосов
/ 18 сентября 2009

Я заметил, что в C ++ есть запечатанные ключевые слова интерфейса. Это только для CLR C ++? Если нет, то когда были запечатаны и добавлен интерфейс к стандарту C ++? Они имеют то же значение в C ++, что и в C #? Если нет, то как мне получить эквивалент в стандарте C ++?

Ответы [ 5 ]

7 голосов
/ 18 сентября 2009
Ключевые слова

sealed и interface предназначены только для C ++ / CLI. Подробнее см. Языковые функции для нацеливания на CLR .

В стандарте C ++ interface можно заменить чисто виртуальным классом и множественным наследованием. Sealed ключевое слово может быть заменено на boost::noninheritable (что еще не является официальной частью повышения).

5 голосов
/ 18 сентября 2009

interface может дублироваться в C ++ с помощью чисто виртуального класса, используя тот факт, что вы можете выполнять множественное наследование.

sealed может быть крылатым с помощью частного конструктора и своего рода фабричного шаблона (для фактического получения экземпляров запечатанного класса). Есть пара других примеров на C ++ FAQ Lite .

4 голосов
/ 18 сентября 2009

interface и sealed были добавлены MS для реализации C ++ / CLI. Однако в текущих версиях компилятора Microsoft также поддерживается ключевое слово sealed для собственного кода , но это расширение, которое вы, вероятно, никогда не найдете в других местах.

Обратите внимание, что MS сделала нечто подобное с override - это расширение ключевого слова в MSVC, которое указывает, что функция предназначена для переопределения виртуальной функции базового класса (компилятор будет жаловаться, если это не так).

По какой-то причине Microsoft не сделала то же самое для ключевого слова interface, но у них есть расширение ключевого слова __interface, которое соответствует вашим ожиданиям. Я подозреваю, что они не добавили собственное расширение ключевого слова interface, потому что идентификатор interface встречается во многих существующих кодах (возможно, в виде макроса, который разрешается до class) - но это всего лишь предположение с моей стороны ,

Еще один фактор того, почему __interface имеет подчеркивания, в то время как sealed и override не может быть, потому что последние являются "контекстно-зависимыми ключевыми словами" - технология, которую 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

, который я украдкой украл у:

1 голос
/ 21 ноября 2011

sealed и interface не соответствуют стандартам 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 { };

С некоторой незначительной макро-абстракцией для переносимости, я не вижу причины не использовать sealed сегодня, если это полезно, и вы регулярно компилируете с компилятором, который его поддерживает (или его стандартизированный синоним final).

0 голосов
/ 18 сентября 2009

__interface действительно в Visual C ++ начиная с VS 2005. Он обеспечивает дополнительную проверку во время компиляции, что интерфейс выглядит и пахнет так, как и должен. (Связанная статья MSDN содержит полную информацию.)

__sealed, однако, представляется только частью «Управляемых расширений для C ++».

...