Это действительно.
Если класс B содержит оригинальный член,
B не содержит D :: Foo, поэтому нет.
или является базой [...] класса, содержащего исходный член
B является базой D, так что это верно. В результате:
результирующий указатель на элемент указывает на исходный элемент
В п. 5.2.9 9 говорится, что вы можете использовать upcast, только если вы также можете использовать downcast, как указано в § 4.11:
Значение типа «указатель на член B типа cv T», где B - тип класса, может быть преобразовано в значение типа «указатель на член D типа cv T», где D - это тип производный класс (пункт 10) из B. Если B является недоступным (пункт 11), неоднозначным (10.2) или виртуальным (10.1) базовым классом D, программа, для которой необходимо это преобразование, является плохо сформированной.
Это просто говорит о том, что вы можете понижать рейтинг до тех пор, пока B доступен, не является виртуальным и отображается только один раз на диаграмме наследования D.
Опасность, присущая указателям на методы апскейдинга, заключается в том, что вы можете вызвать mp
для объекта, фактический тип которого равен B. Пока блок кода, который имеет дело с D :: *, также имеет дело с D *, вы можете избежать этого .