Виртуальная функция — это функция, объявленная в базовом классе, которую можно переопределить в производных классах. Это позволяет иметь разные реализации одной и той же функции во всей иерархии классов.
Невиртуальные функции используют статическое связывание, то есть решение о том, какую функцию вызвать, принимается во время компиляции на основе объявленного типа переменной.
Виртуальные функции используют динамическое связывание, то есть решение о том, какую функцию вызвать, принимается во время выполнения на основе фактического типа объекта.
Возьмём базовый класс Animal с функцией makeSound():
makeSound() невиртуальная и ты вызываешь её через указатель Animal*, выполнится версия из Animal, независимо от того, на объект Dog или Cat на самом деле указывает этот указательmakeSound() виртуальная, во время выполнения вызовется нужная версия из производного класса в зависимости от фактического типа объектаВиртуальные функции обеспечивают полиморфизм, позволяя писать гибкий код, который одинаково работает с разными производными классами, не зная их конкретных типов во время компиляции.
Виртуальные функции — это не то же самое, что перегрузка функций. Перегрузка — это несколько функций с одинаковым именем, но разными параметрами в одном классе, разрешаемые во время компиляции. Виртуальные функции относятся именно к наследованию и разрешению методов во время выполнения.
Объявляй функцию виртуальной, если ты ожидаешь, что производные классы предоставят свои реализации, и хочешь, чтобы вызывалась нужная версия исходя из фактического типа объекта, а не его объявленного типа.
Виртуальные функции используют динамическое связывание для определения во время выполнения, какую функцию вызвать, на основе фактического типа объекта, а невиртуальные функции используют статическое связывание на основе объявленного типа переменной во время компиляции.
Новый — ещё не проверен сообществом
Вы