ToString - это виртуальный метод, не имеет значения, какой тип вашей переменной, имеет значение тип реального объекта.
Если бы метод не был виртуальным, вызов перешел бы к методу, о котором должен знать компилятор, а именно к методу ClassA ToString.
Виртуальные методы реализуются через таблицу поиска, привязанную к типу объекта. Поскольку объект, в котором вы в конечном итоге находитесь в переменной «tempClassA», действительно является объектом типа ClassB, используется таблица поиска для ClassB, и, следовательно, для этого класса используется метод ToString.