Приведенный выше код иллюстрирует тот факт, что в C ++ только функции, отмеченные virtual
, имеют переопределение .Здесь у вас есть перекрытие , а не переопределение.В переопределении и наследовании поведение основано на типе времени выполнения , который является нормальным поведением наследования, которое вы ожидаете, но если вы не объявите его виртуальным, то поведение основано исключительно на времени компиляциитип (т.е. объявленный тип).Поскольку p объявлен как тип Parent *, он использует реализацию в Parent, а c объявлен как тип Child, и поэтому он использует версию, заданную типом Child.Если вы объявили метод виртуальным, то в обоих случаях он будет искать соответствующую версию функции во время выполнения и вызовет версию, заданную в классе Child.
Я также должен добавить, что у вас есть две разные переменные x... если вы хотите разделить переменные между базовым классом и производным классом, вы должны пометить его как «защищенный» в базовом классе (хотя я бы сказал, что это обычно плохой дизайн).Переменная x, которую вы объявляете в Child, отличается от переменной в Parent.Помните, что x является приватным в Parent, и поэтому имя x не имело никакого значения в Child, пока вы не создали вторую переменную с именем x в Child.