Переопределение означает, что метод базового класса или метод производного класса будет вызываться во время выполнения в зависимости от фактического объекта, на который указывает указатель.
Это означает, что:
т.е.Метод базового класса, который может быть вызван, может быть заменен вызовом метода производного класса без каких-либо изменений в вызывающем коде.
Чтобы достичь этого, единственный возможный способ - ограничить типы возврата переопределяющих виртуальных методов так, чтобы они возвращали тот же тип, что и базовый класс, или тип, производный от него (совпадающие типы возврата) иСтандарт обеспечивает соблюдение этого условия.
Если вышеупомянутое условие не выполнялось, было бы окно, чтобы сломать существующий код путем добавления новой функциональности.