Что такое чисто виртуальный вызов
1️⃣ Как кратко ответить
Чисто виртуальный вызов происходит, когда вызывается чисто виртуальная функция через указатель или ссылку на базовый класс, не имея конкретной реализации в производном классе. Это может привести к неопределенному поведению, если объект не является экземпляром производного класса, который реализует эту функцию.
2️⃣ Подробное объяснение темы
В C++ чисто виртуальная функция — это функция, объявленная в базовом классе, которая не имеет реализации и должна быть реализована в производных классах. Она объявляется с помощью синтаксиса = 0 в конце объявления функции. Класс, содержащий хотя бы одну чисто виртуальную функцию, называется абстрактным классом и не может быть инстанцирован напрямую.
Зачем нужны чисто виртуальные функции
Чисто виртуальные функции используются для создания интерфейсов в C++. Они позволяют определить набор функций, которые должны быть реализованы в производных классах. Это обеспечивает полиморфизм, позволяя работать с объектами различных классов через указатели или ссылки на базовый класс.
Пример кода
#include <iostream>
// Абстрактный класс с чисто виртуальной функцией
class Shape {
public:
// Чисто виртуальная функция для вычисления площади
virtual double area() const = 0;
};
// Производный класс, реализующий чисто виртуальную функцию
class Circle : public Shape {
private:
double radius;
public:
Circle(double r) : radius(r) {}
// Реализация чисто виртуальной функции
double area() const override {
return 3.14159 * radius * radius;
}
};
// Производный класс, не реализующий чисто виртуальную функцию
class IncompleteShape : public Shape {
// Нет реализации функции area()
};
int main() {
// Создание объекта Circle
Circle circle(5.0);
// Вызов функции area() через указатель на базовый класс
Shape* shapePtr = &circle;
std::cout << "Area of circle: " << shapePtr->area() << std::endl;
// Попытка создать объект IncompleteShape приведет к ошибке компиляции
// IncompleteShape incompleteShape; // Ошибка: нельзя создать объект абстрактного класса
return 0;
}
Объяснение кода
-
Абстрактный класс
Shape:- Содержит чисто виртуальную функцию
area(), которая должна быть реализована в производных классах. = 0в конце объявления функции указывает, что это чисто виртуальная функция.
- Содержит чисто виртуальную функцию
-
Класс
Circle:- Наследует от
Shapeи реализует функциюarea(). - Конструктор
Circle(double r)инициализирует радиус круга.
- Наследует от
-
Класс
IncompleteShape:- Наследует от
Shape, но не реализует функциюarea(), поэтому остается абстрактным.
- Наследует от
-
Функция
main():- Создает объект
Circleи использует указательshapePtrтипаShape*для вызова функцииarea(). - Попытка создать объект
IncompleteShapeзакомментирована, так как это приведет к ошибке компиляции из-за отсутствия реализацииarea().
- Создает объект
Чисто виртуальный вызов
Чисто виртуальный вызов может произойти, если попытаться вызвать чисто виртуальную функцию через указатель или ссылку на базовый класс, не имея соответствующей реализации в производном классе. Это может привести к неопределенному поведению, если объект не является экземпляром производного класса, который реализует эту функцию. В примере выше, если бы IncompleteShape не был абстрактным, попытка вызвать area() через указатель на Shape привела бы к ошибке выполнения.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться