Вот как ->
(доступ к элементу) и *
(косвенное указание) определены .
Как вы указали, ->
будет рекурсивно вызывать ->
на все, что он возвращает, пока он не разрешается в указателе. На этом этапе вы можете делать то, что хотели бы сделать с указателем.
Оператор *
просто не определен для такой работы. Нет рекурсивного вызова к *
для того, что возвращается.
В вашем случае, вы можете добраться до foo
, используя косвенное обращение, но вам придется делать это вручную, например:
(**c).foo();
Обратите также внимание, что ваш конкретный пример не компилируется, потому что *c
возвращает ссылку на объект типа B
, для которого не определено operator<<
.