我有這樣的代碼,它似乎有效。我不知道爲什麼私人靜態方法可以像這樣訪問。可派生類訪問私有靜態成員函數
class Base
{
public:
static void f(){std::cout<<"in base\n";};
};
class Derived:private Base
{
};
int main()
{
Derived::f();
return 0;
}
我有這樣的代碼,它似乎有效。我不知道爲什麼私人靜態方法可以像這樣訪問。可派生類訪問私有靜態成員函數
class Base
{
public:
static void f(){std::cout<<"in base\n";};
};
class Derived:private Base
{
};
int main()
{
Derived::f();
return 0;
}
拒絕所有編譯器我試過了(幾個g ++版本,como在線,IBM xlC)除了sun CC。我的猜測是它是編譯器中的一個錯誤。
不,f
不應該通過Derived
(成員函數除外)訪問,因爲Base
是私人繼承的。 GCC正確報告這個錯誤:
temp.cpp:6: error: ‘static void Base::f()’ is inaccessible
temp.cpp:17: error: within this contex
在你的代碼f()
是私有繼承,所以你不能訪問它像這樣
int main()
{
Derived::f();
return 0;
}
無障礙錯誤f()
在私有繼承,基礎班的所有成員都成爲派生班的私人成員
派生類派生類從基類派生,因此成員函數Base :: f()成爲Derived類的私有成員。類的私有成員不能從類外部訪問(只能在類成員函數內訪問)因此,代碼不能幹淨地編譯。
f()是靜態函數的事實對這些基本的繼承規則和訪問說明符沒有影響。 Base中的非靜態成員函數將顯示相同的行爲。
如果你的編譯器編譯這段代碼,那麼它有一個你應該報告的錯誤。
那不是說'f()'是'public'嗎? – tom502 2011-04-13 14:10:23
@ tom502,但「Base」類是私有繼承的。對於Derived的非成員,「f」不應該是可見的。 – 2011-04-13 14:12:50
我認爲f()不能像這樣訪問 – Badr 2011-04-13 14:15:06