То, что вас попросили описать, что такое виртуальная функция, кажется одним из самых распространенных вопросов в интервью, оценивающих базовые знания C ++. Тем не менее, после нескольких лет программирования на C ++ у меня все еще возникает чувство дискомфорта, что я не совсем понимаю, как лучше определить, что они собой представляют.
Если я проконсультируюсь с Википедией, я увижу определение виртуальной функции:
"В объектно-ориентированном программировании виртуальная функция или виртуальный метод - это функция или метод, поведение которых может быть переопределено в классе наследования функцией с такой же сигнатурой"
Это определение кажется простым и элегантным, а не специфичным для C ++. Но мне кажется, что это не отражает концепцию виртуальной функции в C ++, поскольку, безусловно, не виртуальная функция также может быть переопределена в наследующем классе функцией с такой же сигнатурой.
Если меня попросят описать, что такое виртуальная функция, неофициально, я скажу что-то о указателях, таких как «это метод, такой, что когда вы вызываете его через указатель базового класса, вызывается версия, определенная в производном классе». вместо этого, если указатель фактически указывает на экземпляр производного класса ". Это не похоже на очень элегантное описание концепции. Я знаю, что люди говорят, что именно так "полиморфизм" достигается в C ++ (насколько я понимаю, полиморфизм - это, примерно, вся идея организации объектов в иерархии), но я не знаю более причудливого способа понять или объяснить механизм, чем пройти через пример с указателями.
Полагаю, меня смущает вопрос о том, является ли описание "указателя" виртуальных функций чем-то фундаментальным для их определения, или просто случайным для их реализации в C ++.