В следующем примере (извинения за длину) я попытался выделить какое-то неожиданное поведение, с которым я столкнулся при использовании вложенных классов в классе, который наследует друг от друга. Я часто видел утверждения о том, что нет ничего особенного в вложенном классе по сравнению с неназванным классом, но в этом примере можно увидеть, что вложенный класс (по крайней мере, согласно GCC 4.4) может видеть публичные typedefs класс, который приватно унаследован закрывающим классом.Видимость приватно унаследованных typedefs для вложенных классов
Я ценю, что typdefs не совпадают с данными элемента, но я обнаружил, что это поведение удивительно, и я думаю, что многие другие тоже. Поэтому мой вопрос двоякий:
- Это стандартное поведение? (достойное объяснение, почему было бы очень полезно)
- Можно ли ожидать, что он будет работать на большинстве современных компиляторов (т. е. насколько он переносим)?
#include <iostream>
class Base {
typedef int priv_t;
priv_t priv;
public:
typedef int pub_t;
pub_t pub;
Base() : priv(0), pub(1) {}
};
class PubDerived : public Base {
public:
// Not allowed since Base::priv is private
// void foo() {std::cout << priv << "\n";}
class Nested {
// Not allowed since Nested has no access to PubDerived member data
// void foo() {std::cout << pub << "\n";}
// Not allowed since typedef Base::priv_t is private
// void bar() {priv_t x=0; std::cout << x << "\n";}
};
};
class PrivDerived : private Base {
public:
// Allowed since Base::pub is public
void foo() {std::cout << pub << "\n";}
class Nested {
public:
// Works (gcc 4.4 - see below)
void fred() {pub_t x=0; std::cout << x << "\n";}
};
};
int main() {
// Not allowed since typedef Base::priv_t private
// std::cout << PubDerived::priv_t(0) << "\n";
// Allowed since typedef Base::pub_t is inaccessible
std::cout << PubDerived::pub_t(0) << "\n"; // Prints 0
// Not allowed since typedef Base::pub_t is inaccessible
//std::cout << PrivDerived::pub_t(0) << "\n";
// Works (gcc 4.4)
PrivDerived::Nested o;
o.fred(); // Prints 0
return 0;
}
Добро пожаловать в StackOverflow! – fbrereto
соблазн отредактировать комментарий «первый раз на stackoverflow», потому что вопрос красиво спросил;) –
Теплый прием и отличные ответы. Огромное спасибо. – beldaz