假設您有一個定義了訪問說明符public的虛擬方法的類。 您可以更改您的重寫方法的訪問說明符嗎? 我假設沒有。 尋找解釋。覆蓋方法時的訪問說明符
回答
是的,你可以,但它「不討人喜歡」。
看看Overriding public virtual functions with private functions in C++
你絕對可以。但這沒有意義。如果它是一個公共繼承,那麼你總是可以將一個對象投射到它的基礎上。如果是私有繼承,則默認情況下所有基本方法都已經是私有的。在保護繼承的情況下,你可以使基本方法是私有的,所以你可以防止可能的派生類調用它,但我不明白爲什麼可能需要它。
是的,你可以,事實上,你甚至不需要重寫或使用虛擬任何東西。
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
特別聲明的ABC
的public
界面確實是通過D
無法訪問,因爲你不能將能上溯造型到ABC
。如果woof
和moo
分別爲virtual
,則您希望覆蓋private
以隱藏它們。也許這更好地回答了這個問題。
我很肯定,如果他們在ABC類中是「私人」的話,那麼它會有很大的不同。 'D類'必須有權訪問基本成員,然後才能在'using'聲明中成功命名它們。 OTOH,它們本來可以在'ABC'中被'保護',並且使用仍然有效。 – 2010-04-20 03:09:55
@Ben:對不起,我的意思是保護。固定。 – Potatoswatter 2010-04-20 03:36:38
答案是:有點。您只能更改派生類可以訪問的成員的訪問權限。繼承類型不起作用 - 它只控制繼承成員的默認訪問權限(遵循其他規則)。
因此,您可以將基類的受保護成員設爲公共或私有;或基地的公共成員是受保護的或私人的。但是,您不能讓基地的私人會員公開或受到保護。
實施例:
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:錯誤:在此範圍內
此外,重寫與更改方法的訪問無關。你可以重寫一個虛擬的私有方法,你不能從派生類中調用它。
- 1. 覆蓋學說魔術訪問方法
- 2. 未知覆蓋說明符
- 3. Ruby mixin覆蓋方法說明
- 4. 在Logback中覆蓋方法名稱(%M轉換說明符)
- 5. 訪問說明符
- 6. Java - 訪問說明符
- 7. 接口聲明的訪問說明符
- 8. 訪問說明
- 9. 接口方法的可訪問性說明符vs javadoc中的類方法
- 10. 訪問說明符如何影響靜態方法?
- 11. Java代碼覆蓋漏洞說明?
- 12. 覆蓋訪問類
- 13. 實時方法覆蓋
- 14. 訪問說明符和訪問修飾符有什麼區別?
- 15. Java:變量訪問說明符
- 16. =默認忽略訪問說明符?
- 17. 訪問說明符和虛函數
- 18. C#內部訪問說明符,
- 19. Apex訪問說明符和測試類
- 20. 覆蓋方法
- 21. 覆蓋方法
- 22. 覆蓋'+'方法
- 23. 覆蓋方法
- 24. 覆蓋方法
- 25. 訪問衝突覆蓋C字符串
- 26. @覆蓋訪問器時的語法語法
- 27. 將說明符覆蓋爲模板參數 - 是否有效?
- 28. C++ - 錯誤C3646:未知覆蓋說明符
- 29. Java方法覆蓋 - 「方法不會覆蓋超級方法...」
- 30. 覆蓋物品而無法訪問
但正如引用的parashift.com常見問題所述,這不適用於私有/受保護的繼承。 – Potatoswatter 2010-04-21 05:11:30