abstract (C++/CLI and C++/CX)

Ключевое слово abstract объявляет, что:

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

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

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

Синтаксис

class-declarationclass-identifierabstract {}

virtualабстрактный элемент-функция-function-identifier() возвращаемого типа;

Замечания

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

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

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

Во время компиляции можно определить, является ли тип абстрактным, с помощью признака типа __is_abstract(type). Дополнительные сведения см. в статье Compiler Support for Type Traits (C++/CLI and C++/CX) (Поддержка признаков типов компилятором (C++/CLI и C++/CX)).

Ключевое слово abstract является контекстно-зависимым описателем переопределения. Подробные сведения о контекстно-зависимых ключевых словах см. в статье Context-Sensitive Keywords (C++/CLI and C++/CX) (Контекстно-зависимые ключевые слова (C++/CLI and C++/CX)). Дополнительные сведения о описателях переопределения см. в разделе "Практическое руководство. Объявление описателей переопределения" в машинных компиляциях.

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

Подробные сведения см. в статье Ref classes and structs (C++/CX) (Ссылочные классы и структуры (C++/CX)).

Требования

Параметр компилятора: /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
};

См. также

Расширения компонентов для .NET и UWP