Ключевое
Виртуальные функции в C++ позволяют производным классам переопределять методы базового класса для реализации специфичного поведения. Они обеспечивают динамический полиморфизм.
Виртуальная функция — это метод, который объявляется с ключевым словом virtual в базовом классе и может быть переопределен в производных классах.
Основные моменты
- Виртуальная функция объявляется в базовом классе с ключевым словом
virtual
. - Переопределение в производном классе осуществляется с тем же сигнатурой и с возможностью использования ключевого слова
override
для явного указания на переопределение. - Виртуальная таблица (vtable) используется для обеспечения динамического полиморфизма.
Пример
#include <iostream>
class Base {
public:
virtual void show() {
std::cout << "Base class show() method" << std::endl;
}
virtual ~Base() {} // Виртуальный деструктор
};
class Derived : public Base {
public:
void show() override {
std::cout << "Derived class show() method" << std::endl;
}
};
void display(Base& obj) {
obj.show(); // Вызывает метод show() в зависимости от типа объекта
}
int main() {
Base baseObj;
Derived derivedObj;
display(baseObj); // Вывод: Base class show() method
display(derivedObj); // Вывод: Derived class show() method
return 0;
}
Деструкторы:
- Деструкторы в базовых классах должны быть виртуальными, чтобы гарантировать правильный вызов деструкторов производных классов при удалении объекта через указатель на базовый класс.
class Base {
public:
virtual ~Base() {
std::cout << "Base destructor" << std::endl;
}
};
class Derived : public Base {
public:
~Derived() {
std::cout << "Derived destructor" << std::endl;
}
};
int main() {
Base* obj = new Derived();
delete obj; // Вывод: Derived destructor, затем Base destructor
return 0;
}
Правила:
- Ключевое слово
virtual
используется только в объявлении метода базового класса. - Ключевое слово
override
(не обязательно, но рекомендуется) используется в объявлении метода производного класса для явного указания на переопределение виртуального метода.
Полиморфизм:
- Виртуальные функции позволяют вызывать методы производных классов через указатель или ссылку на базовый класс, обеспечивая динамический полиморфизм.