abstract (расширения компонентов C++)

Ключевое слово abstract определяет следующее:

  • Тип можно использовать в качестве базового типа, но сам тип не создается.

  • Функции члена типа можно указывать только в производном типе.

Все платформы

Синтаксис

class-declaration class-identifier abstract {}
virtual return-type member-function-identifier() abstract ;

Примечания

Первый пример синтаксиса объявляет класс как абстрактный. Компонент class-declaration может быть собственным объявлением C++ (class или struct), или объявлением расширения C++ (ref class или ref struct), если указан параметр компилятора /ZW или /clr.

Второй пример синтаксиса объявляет виртуальный член функции как абстрактный. Объявление абстракта функции — это то же самое, что объявление его как чисто виртуальной функции. Объявление абстрактного члена функции также служит причиной того, что включающий класс будет объявлен как абстрактный.

Ключевое слово abstract поддерживается только в собственном и характерном для платформы коде; то есть его можно скомпилировать вне зависимости от наличия параметра компилятора /ZW или /clr.

Во время компиляции можно определить, является ли тип абстрактным с характеристикой типа __is_abstract(type). Для получения дополнительной информации см. Поддержка характеристик типов компилятором (расширения компонентов C++).

Ключевое слово abstract является контекстно-зависимым спецификатором переопределения. Дополнительные сведения о контекстно-зависимых ключевых словах см. в разделе Контекстные ключевые слова (расширения компонентов C++). Дополнительные сведения о спецификаторах переопределения см. в разделе Практическое руководство: Объявление спецификаторов переопределения в собственных компиляциях.

Среда выполнения Windows

Дополнительные сведения см. в Ссылочные классы и структуры.

Требования

Параметр компилятора: /ZW

Среда CLR

Требования

Параметр компилятора: /clr

Примеры

Пример

Следующий пример кода генерирует ошибку, поскольку класс X помечен атрибутом abstract.

// abstract_keyword.cpp
// compile with: /clr
ref class X abstract {
public:
   virtual void f() {}
};

int main() {
   X ^ MyX = gcnew X;   // C3622
}

Пример

Следующий пример кода генерирует ошибку, поскольку он создает собственный класс, помеченный как abstract. Эта ошибка возникает вне зависимости от наличия параметра компилятора /clr.

// abstract_keyword_2.cpp
class X abstract {
public:
   virtual void f() {}
};

int main() {
   X * MyX = new X; // C3622: 'X': a class declared as 'abstract'
                    // cannot be instantiated. See declaration of 'X'}

Пример

Следующий пример кода генерирует ошибку, поскольку функция f содержит определение, но помечена атрибутом abstract. Последний оператор в примере показывает, что определение абстрактной виртуальной функции эквивалентно определению чисто виртуальной функции.

// abstract_keyword_3.cpp
// compile with: /clr
ref class X {
public:
   virtual void f() abstract {}   // C3634
   virtual void g() = 0 {}   // C3634
};

См. также

Основные понятия

Расширения компонентов для платформ среды выполнения