Виртуальные функции C++: что это и как использовать
Виртуальные функции являются одним из основных инструментов полиморфизма в языке программирования C++. Они позволяют объектам производных классов переопределять поведение функций базового класса. Это позволяет использовать объекты производных классов так же, как объекты базового класса, не зная их конкретного типа.
Для объявления виртуальной функции в C++ используется ключевое слово "virtual". Например, следующий код объявляет виртуальную функцию "doSomething" в базовом классе "Animal":
cpp
class Animal {
public:
virtual void doSomething() {
std::cout << "Animal does something." << std::endl;
}
};
Это означает, что все классы, производные от класса Animal, смогут переопределять функцию "doSomething" и изменять ее поведение. Например, рассмотрим класс "Dog", который наследуется от класса "Animal" и переопределяет функцию "doSomething":
cpp
class Dog : public Animal {
public:
void doSomething() override {
std::cout << "Dog barks." << std::endl;
}
};
Теперь, если создать объект класса "Dog" и вызвать у него функцию "doSomething", то будет выполнен код из переопределенной функции "doSomething" в классе "Dog":
cpp
Dog myDog;
myDog.doSomething(); // output: "Dog barks."
Однако, если создать объект базового класса "Animal" и вызвать у него функцию "doSomething", то будет выполнен код базовой функции "doSomething" в классе "Animal":
cpp
Animal* myAnimal = new Dog();
myAnimal->doSomething(); // output: "Dog barks."
Это происходит потому, что мы создаем объект класса "Dog", но сохраняем в указателе на базовый класс "Animal". При вызове виртуальной функции, компилятор C++ выбирает версию функции в соответствии с типом объекта, на котором она вызывается.
Таким образом, использование виртуальных функций позволяет реализовать полиморфизм в C++, что упрощает работу с объектами разных классов, наследующих общий базовый класс.