發新話題

[分享] 深入淺出C++之private/public/protected

深入淺出C++之private/public/protected

已知3個類O、P和Q,類O中定義了一個私有方法F1、一個公有方法F2和一個受保護的方法F3:類P和類Q是類O的派生類,其繼承方式如下所示:
複製內容到剪貼板
代碼:
class P : protected O {…};
class Q : public O {…};
關於方法F1的描述中正確的是___(34)___;關於方法F2韻描述中正確的是___(35)___;關於方法F3的描述中正確的是___(36)___。
(34)
A.方法F1無法被訪問
B.只有在類O內才能訪問方法F1
C.只有在類P內才能訪問方法F1
D.只有在類Q內才能訪問方法F1
(35)
A.類O、P和Q的對象都可以訪問方法F2
B.類P和Q的對象都可以訪問方法F2
C.類0和Q的對象都可以訪問方法F2
D.只有在類P內才能訪問方法F2
(36)A.類0、P和Q的對象都可以訪問方法F3
B.類0、P和Q的對象都不可以訪問方法F3
C.類0和Q的對象都可以訪問方法F3
D.類P和Q的對象都可以訪問方法F3。

有甚麼辦法可以簡單地記住這許多的規則? 下文告訴你一個根本不需要記的辦法。

顧名思義,private/public/protected 分別表示 私有/公開/保護,它們是一組用於訪問權限控制的關鍵字。那麼首先,需要澄清的一個關鍵點是,是要控制誰訪問誰的權限?這個訪問的主語(施事)是誰?賓語(受事)是誰?

我們經常聽到這樣的說法:

1)一個類友元可以訪問該類的任何成員(包括成員變量及成員方法,下同)。
2)private成員只有該類自身可以訪問,protected成員只有該類及其派生類可以訪問,public成員所有的人都可以訪問。

賓語(受事)是誰這一點很明確,是類的成員(包括成員變量及成員方法)。主語(施事)是誰?這是讓大家發生混淆的關鍵點。也是這個說法中含糊不清的地方。

想清楚一點,其實主語(施事)指的是一個函數,而不是類(當然更不是變量)。private/public/protected要控制的是一個函數(施事)對一個類的成員(包括成員變量及成員方法)的訪問權限。因此比較完整的說法是:

1)一個類友元(包含友元函數或者友元類的所有成員函數)可以訪問該類的任何成員(包括成員變量及成員方法)。

2)除去友元外,private成員只有該類自身的成員函數可以訪問,protected成員只有該類的成員函數及其派生類的成員函數可以訪問,public成員則所有的函數都可以訪問。

也就是說,當我們說一個類可以訪問XXX,其實暗指這個類的成員函數可以訪問XXX。瞭解了這一點,外加一條顯而易見的規則,上面的問題就不難回答了。這條規則是:

3)派生類在繼承時可削弱成員的訪問權限(通過protected/private修飾)。例如上面的例子class P : protected O {…}; 那麼某個函數通過類P訪問O中成員時,該函數對類O中的public成員只有protected權限。

補充:有一種技術叫Member Spy(類成員間諜),通過該技術派生類可將基類的protected成員修改為public權限。這種技術用到了using關鍵字。舉例如下:
複製內容到剪貼板
代碼:
class A
{
protected:
 int m_data;
};

class SpyA : public A
{
public:
 using A::m_data;
};

void TestSpy(A* pA)
{
 SpyA* pSpyA = static_cast<SpyA*>(pA);
 // 強制轉換A為SpyA,這要求SpyA沒有成員變量且沒有重載A中的虛函數。
 // 現在你可以通過pSpyA訪問m_data了。例如:int data = pSpyA->m_data;
}
由於這種技術用到了強制類型轉換,當謹慎使用。

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。