2010-04-19 81 views

回答

1

你絕對可以。但這沒有意義。如果它是一個公共繼承,那麼你總是可以將一個對象投射到它的基礎上。如果是私有繼承,則默認情況下所有基本方法都已經是私有的。在保護繼承的情況下,你可以使基本方法是私有的,所以你可以防止可能的派生類調用它,但我不明白爲什麼可能需要它。

0

是的,你可以,事實上,你甚至不需要重寫或使用虛擬任何東西。

class ABC { 
public: // or this may be protected, no difference 
    void woof(); 
    void moo(); 
}; 

class D : private ABC { // now woof and moo are private 
public: 
    using ABC::woof; // using declaration to make woof public again 
    ABC::moo; // access declaration (deprecated) does the same 
}; 

同樣的作品,如果他們也是虛擬的。或者,正如其他人指出的那樣,虛擬函數查找會忽略實現類指定的訪問;任何你可以投入的類都可以在編譯時提供訪問權限。

在另一方面,在不D特別聲明的ABCpublic界面確實是通過D無法訪問,因爲你不能將能上溯造型到ABC。如果woofmoo分別爲virtual,則您希望覆蓋private以隱藏它們。也許這更好地回答了這個問題。

+1

我很肯定,如果他們在ABC類中是「私人」的話,那麼它會有很大的不同。 'D類'必須有權訪問基本成員,然後才能在'using'聲明中成功命名它們。 OTOH,它們本來可以在'ABC'中被'保護',並且使用仍然有效。 – 2010-04-20 03:09:55

+0

@Ben:對不起,我的意思是保護。固定。 – Potatoswatter 2010-04-20 03:36:38

5

答案是:有點。您只能更改派生類可以訪問的成員的訪問權限。繼承類型不起作用 - 它只控制繼承成員的默認訪問權限(遵循其他規則)。

因此,您可以將基類的受保護成員設爲公共或私有;或基地的公共成員是受保護的或私人的。但是,您不能讓基地的私人會員公開或受到保護。

實施例:

class Foo 
{ 
protected: 
     void protected_member(); 

private: 
     void private_member(); 

public: 
     void public_member(); 
}; 

class Bar : private Foo 
{ 
public: 
     using Foo::protected_member; 
     using Foo::private_member; 
     using Foo::public_member; 
}; 

int main(int, const char**) 
{ 
     Bar bar; 

     return 0; 
} 

上面的代碼引發對於g ++ 4.1.2以下錯誤:

MAIN.C:7:錯誤: '無效美孚:: PRIVATE_MEMBER()' 是私人

main.C:14:錯誤:在此範圍內

此外,重寫與更改方法的訪問無關。你可以重寫一個虛擬的私有方法,你不能從派生類中調用它。