Выходные данные вашей программы - реализация класса Animal
Foo
, поскольку тип ссылки равен Animal
, а не Cat
.
Если ссылка имеет тип Cat
результат будет "Cat::Foo()"
.
Метод Foo
класса Cat
скрывает метод Foo
класса Animal
, поскольку базовые классы не могут и не должны знать оих производные классы, в то время как производные классы являются и должны знать свои базовые классы.
Чтобы преднамеренно скрыть член базового класса, используйте модификатор new
.Это скажет компилятору, что сокрытие является преднамеренным, и подавит предупреждение.