Нет, когда вы создаете новый метод (ToString), он не является виртуальным. Новый просто означает, что вы не возражаете против того, чтобы он «скрывал» версию в базовом классе - поэтому, если вы вызываете его со ссылкой, которую вы привели к определенному типу (A), он выполняет метод в классе A, независимо от того, фактический тип объекта, который вы вызываете. (то есть вы вызвали A.ToString (), поэтому он выполнил A.ToString ())
Когда вы создаете виртуальный метод, то независимо от того, к какому типу вы приводите ссылку, используется реализация из фактического типа объекта (т. Е. Вы создали B, поэтому при вызове ( каким бы ни был объект). Здравствуйте, он называется Б. Привет)
Принципиальное отличие состоит в том, что один вызов является виртуальным, а другой - нет.