Вы ничего не меняете своим составом Вы применяете First * к First *, что является просто назначением. Поскольку t является Second с = new Second(2)
, вы переопределили виртуальную таблицу с записями дочернего элемента, поэтому она будет вызывать методы дочернего элемента, а не родителей.
cTest - это просто указатель на первый, который указывает на тот же объект, что и t, поскольку cTest и t содержат один и тот же адрес памяти, по которому существует второй объект, поэтому и вызывается метод Second.