Виртуальные функции в языке программирования C
Виртуальные функции в С++ - это мощный механизм, позволяющий реализовывать полиморфизм и динамическую связь объектов. Они позволяют вызывать функции базового класса через указатель на объект производного класса.
В языке С++, когда объект производного класса является указателем на базовый класс, вызов виртуальной функции происходит на основе реального типа объекта, а не на основе типа указателя. Это позволяет обрабатывать объекты различных типов, без явного указания на их конкретные типы.
Пример кода:
#include <iostream>
class Shape {
public:
virtual void draw() {
std::cout << "Рисуем фигуру" << std::endl;
}
};
class Circle : public Shape {
public:
void draw() override {
std::cout << "Рисуем круг" << std::endl;
}
};
class Square : public Shape {
public:
void draw() override {
std::cout << "Рисуем квадрат" << std::endl;
}
};
int main() {
Shape* shape = new Circle();
shape->draw(); // Выводит "Рисуем круг"
Shape* shape2 = new Square();
shape2->draw(); // Выводит "Рисуем квадрат"
delete shape;
delete shape2;
return 0;
}
В данном примере мы создаем 3 класса: Shape, Circle и Square. Класс Shape - базовый класс, а классы Circle и Square являются производными от него. В базовом классе есть виртуальная функция draw(), которую мы переопределяем в производных классах.
В функции main() мы создаем указатели на объекты классов Circle и Square, которые присваиваем указателю на базовый класс Shape. Затем, при вызове функции draw() через указатель, происходит вызов соответствующей функции для реального типа объекта.
В результате, при вызове функции draw() через указатель shape, объект Circle будет использовать свою реализацию функции draw() и выведет "Рисуем круг". Аналогично, при вызове функции draw() через указатель shape2, объект Square будет использовать свою реализацию функции draw() и выведет "Рисуем квадрат".
Таким образом, виртуальные функции в С++ позволяют работать с объектами различных типов через указатель на базовый класс, что упрощает и увеличивает гибкость работы с объектами и их наследованием. Они являются неотъемлемой частью полиморфизма и динамической связи в С++.