Я предполагаю, что вы знаете назначение виртуального ключевого слова, но удивляетесь, почему оно внезапно появляется в подтипе. Если я ошибаюсь, мой ответ, вероятно, не будет иметь большого смысла, но подойдет любая ссылка на C ++.
Совершенно законно помещать виртуальный в производный класс. В результате, если у вас есть ссылка или указатель на этот класс или любой из его подклассов, вызовы этой функции будут связаны динамически в зависимости от типа среды выполнения.
Однако, хотя это и законно, не рекомендуется использовать невиртуальный метод в базовом классе и виртуальный в переопределенной версии.
Одной из причин является то, что у вас может быть экземпляр производного класса, а затем один указатель на базу и один указатель на производный, и оба указателя нацелены на этот экземпляр. Вызов одной и той же функции для каждого указателя будет иметь другой результат, поскольку вызов указателя, объявленного с базовым классом, нацелит определение на базовый класс.