2011-04-13 177 views
0

我有這樣的代碼,它似乎有效。我不知道爲什麼私人靜態方法可以像這樣訪問。可派生類訪問私有靜態成員函數

class Base 
{ 
    public: 
     static void f(){std::cout<<"in base\n";}; 
}; 

class Derived:private Base 
{ 
}; 


int main() 
{ 

    Derived::f(); 
    return 0; 
} 
+2

那不是說'f()'是'public'嗎? – tom502 2011-04-13 14:10:23

+0

@ tom502,但「Base」類是私有繼承的。對於Derived的非成員,「f」不應該是可見的。 – 2011-04-13 14:12:50

+0

我認爲f()不能像這樣訪問 – Badr 2011-04-13 14:15:06

回答

3

拒絕所有編譯器我試過了(幾個g ++版本,como在線,IBM xlC)除了sun CC。我的猜測是它是編譯器中的一個錯誤。

1

不,f不應該通過Derived(成員函數除外)訪問,因爲Base是私人繼承的。 GCC正確報告這個錯誤:

temp.cpp:6: error: ‘static void Base::f()’ is inaccessible 
temp.cpp:17: error: within this contex 
0

在你的代碼f()是私有繼承,所以你不能訪問它像這樣

int main() 
{ 

    Derived::f(); 
    return 0; 
} 

無障礙錯誤f()

0

在私有繼承,基礎班的所有成員都成爲派生班的私人成員

派生類派生類從基類派生,因此成員函數Base :: f()成爲Derived類的私有成員。類的私有成員不能從類外部訪問(只能在類成員函數內訪問)因此,代碼不能幹淨地編譯。

f()是靜態函數的事實對這些基本的繼承規則和訪問說明符沒有影響。 Base中的非靜態成員函數將顯示相同的行爲。

如果你的編譯器編譯這段代碼,那麼它有一個你應該報告的錯誤。

相關問題