pB
относится к типу B&
.Следовательно, любой вызванный метод (например, operator->
) получит подпись в B
, поэтому pB.operator->()
вернет B*
.Конечно, поскольку он виртуальный, используется фактическая реализация в D
.Важно то, что тип возвращаемого значения определяется типом переменной pB.
Итак, наш operator->
вернул B*
, и, следовательно, вызов foo()
продолжается, как и для любого другого B*
.