← Назад ко всем вопросам

Что такое чисто виртуальный вызов

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

Объяснение кода

  1. Абстрактный класс Shape:

    • Содержит чисто виртуальную функцию area(), которая должна быть реализована в производных классах.
    • = 0 в конце объявления функции указывает, что это чисто виртуальная функция.
  2. Класс Circle:

    • Наследует от Shape и реализует функцию area().
    • Конструктор Circle(double r) инициализирует радиус круга.
  3. Класс IncompleteShape:

    • Наследует от Shape, но не реализует функцию area(), поэтому остается абстрактным.
  4. Функция main():

    • Создает объект Circle и использует указатель shapePtr типа Shape* для вызова функции area().
    • Попытка создать объект IncompleteShape закомментирована, так как это приведет к ошибке компиляции из-за отсутствия реализации area().

Чисто виртуальный вызов

Чисто виртуальный вызов может произойти, если попытаться вызвать чисто виртуальную функцию через указатель или ссылку на базовый класс, не имея соответствующей реализации в производном классе. Это может привести к неопределенному поведению, если объект не является экземпляром производного класса, который реализует эту функцию. В примере выше, если бы IncompleteShape не был абстрактным, попытка вызвать area() через указатель на Shape привела бы к ошибке выполнения.

Тема: Классы / ООП / Полиморфизм
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки