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
};