abstract (C++/CLI and C++/CX)
Ключевое слово abstract объявляет, что:
Тип можно использовать в качестве базового типа, но экземпляр самого тип не может быть создан.
Функция-член типа может определяться только в производном типе.
Все платформы
Синтаксис
Абстрактный абстрактный идентификатор класса-объявления класса{}
virtual
возвращаемый тип абстрактный идентификатор-член-функция () ;
Замечания
В первом примере синтаксиса объявляется абстрактный класс. Компонент объявления класса может быть либо собственным объявлением 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
};