Иногда реализация всей функции не может быть предоставлена в базовом классе, потому что мы не знаем реализацию. Такой класс называется абстрактным классом. Например, пусть Shape будет базовым классом. Мы не можем обеспечить реализацию функции draw () в Shape, но мы знаем, что каждый производный класс должен иметь реализацию draw (). Точно так же класс Animal не имеет реализации move () (при условии, что все животные двигаются), но все животные должны знать, как двигаться. Мы не можем создавать объекты абстрактных классов.
Чистая виртуальная функция (или абстрактная функция) в C ++ — это виртуальная функция, для которой у нас нет реализации, мы только объявляем ее. Чистая виртуальная функция объявляется путем присвоения 0 в объявлении. Смотрите следующий пример.
|
Полный пример:
Чистая виртуальная функция реализуется классами, которые являются производными от абстрактного класса. Ниже приведен простой пример, демонстрирующий то же самое.
|
Выход:
fun() called
Некоторые интересные факты:
1) Класс является абстрактным, если он имеет хотя бы одну чисто виртуальную функцию.
В следующем примере Test является абстрактным классом, потому что он имеет чисто виртуальную функцию show ().
|
Выход:
Compiler Error: cannot declare variable 't' to be of abstract type 'Test' because the following virtual functions are pure within 'Test': note: virtual void Test::show()
2) У нас могут быть указатели и ссылки на абстрактный тип класса.
Например, следующая программа работает нормально.
|
Выход:
In Derived
3) Если мы не переопределяем чисто виртуальную функцию в производном классе, то производный класс также становится абстрактным классом.
Следующий пример демонстрирует то же самое.
|
Compiler Error: cannot declare variable 'd' to be of abstract type 'Derived' because the following virtual functions are pure within 'Derived': virtual void Base::show()
4) Абстрактный класс может иметь конструкторы.
Например, следующая программа компилируется и работает нормально.
|
Выход:
x = 4, y = 5
Сравнение с Java
В Java класс можно сделать абстрактным, используя ключевое слово abstract. Точно так же функцию можно сделать чисто виртуальной или абстрактной, используя ключевое слово abstract. Видеть
Абстрактные классы в Java для более подробной информации.
Интерфейс против абстрактных классов:
Интерфейс не имеет реализации ни одного из своих методов, его можно рассматривать как набор объявлений методов. В C ++ интерфейс можно смоделировать, сделав все методы чисто виртуальными. В Java есть отдельное ключевое слово для интерфейса.
Пожалуйста, напишите комментарии, если вы обнаружите что-то неправильное, или вы хотите поделиться дополнительной информацией по обсуждаемой теме
Рекомендуемые посты:
- Виртуальные функции в производных классах
- Чистый виртуальный деструктор в C ++
- Чистые функции
- Абстрактные классы на Java
- Вопросы об интервью C ++ по виртуальной функции и абстрактному классу
- Можно ли встроить виртуальные функции?
- Могут ли виртуальные функции быть закрытыми в C ++?
- Могут ли статические функции быть виртуальными в C ++?
- Виртуальные функции и полиморфизм времени выполнения в C ++ | Комплект 1 (Введение)
- Что происходит, когда виртуальная функция вызывается внутри не виртуальной функции в C ++
- Математические функции в Python | Набор 2 (логарифмические и степенные функции)
- Математические функции в Python | Установите 1 (числовые функции)
- абстрактное ключевое слово в Java
- Разница между абстрактным классом и интерфейсом в Java
- Виртуальный деструктор
0.00 (0%) 0 votes