Ответ 1
Base::Foo
и Derived::Foo
действительно являются одним и тем же типом, класс является просто составным типом (из черновик стандарта С++ 3.9.2
), и мы не ожидали, что тип, унаследованный от базового класса, будет другим типом в производном классе. Например, если Base
содержит:
typedef int newType1 ;
пока Derived
не обновил newType1
, тогда мы ожидали бы, что Base::newType1
и Derived::newType1
будут одного и того же типа, а вложенный класс не отличается. Если мы ссылаемся на проект стандартного раздела 9.2
Члены класса, параграф 1, говорит (внимание мое):
[...] Члены класса представляют элементы данных, функции-члены (9.3), вложенные типы и счетчики. Элементы данных и функции-члены являются статическими или нестационарными; см. 9.4. Вложенные типы классы (9.1, 9.7) и перечисления (7.2), определенные в классе, и произвольные типы, объявленные как члены, с помощью объявления typedef (7.1.3).
Это подтверждает, что интуитивные вложенные классы - это просто типы (а также члены), для раздела сателлита без поддержки 9.7
, на который ссылаются выше, находится раздел вложенного класса и из раздела 10
Производные классы, параграф 1, мы видим:
[...] Если не указано в производном классе, члены базового класса также считаются членами производного класса. [...]
Так как они одного типа, catch будет работать нормально.