在下面的示例中(道歉的長度)我試圖隔離一些在私有繼承類中使用嵌套類時遇到的意外行爲。我經常看到一些聲明,說明與非內置類相比,嵌套類沒有什麼特別之處,但在本例中,可以看到一個嵌套類(至少根據GCC 4.4)可以看到一個嵌套類的公共類型定義類由閉幕類私下繼承。私有繼承的類型定義對嵌套類的可見性
我明白,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 2010-03-10 23:47:08
試圖編輯「第一次在stackoverflow」評論,因爲問題是精美的問; – 2010-03-10 23:47:22
熱烈的接待和偉大的答案。非常感謝。 – beldaz 2010-03-11 04:31:50