Вот читаю википедию, и там сказано:
Переопределение метода (англ. Method overriding) в объектно-ориентированном программировании — одна из возможностей языка программирования, позволяющая подклассу или дочернему классу обеспечивать специфическую реализацию метода, уже реализованного в одном из суперклассов или родительских классов. Реализация метода в подклассе переопределяет (заменяет) его реализацию в суперклассе, описывая метод с тем же названием, что и у метода суперкласса, а также у нового метода подкласса должны быть те же параметры или сигнатура, тип возвращаемого результата, что и у метода родительского класса
Далее такой код:
struct A {
void fn() { std::cout << "A\n"; }
};
struct B : A {
void fn() { std::cout << "B\n"; }
};
int main() {
B b;
b.fn();
}
Специалисты с++ говорят, что нельзя переопределить метод, если не пометить его как virtual в базовом классе. Я согласен, но это, ведь, работает только тогда, когда идет речь о полиморфизме.
Идет вызов b.fn() и результат - "B" в консоли. То есть в структуре B реализована собственная имплементация метода fn, подменяющая тот же самый метод в базовом классе. Все согласно определнию. Так в чем же правда?
UPD:
Хорошо. Если в официальной доке с++ где-то написано "переопределение возможно тогда и только тогда, когда есть virtual у метода базового класса", то почему именно так?