Поделиться через


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

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

b0z6b513.collapse_all(ru-ru,VS.110).gifТребования

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

Среда CLR

b0z6b513.collapse_all(ru-ru,VS.110).gifТребования

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

b0z6b513.collapse_all(ru-ru,VS.110).gifПримеры

Пример

Следующий пример кода генерирует ошибку, поскольку класс 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
};

См. также

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

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