1. 程式人生 > >C++類中public,private和protected的作用詳解

C++類中public,private和protected的作用詳解

首先摘抄一下譚浩強的《C++程式設計》中關於public,private和protected這三個成員訪問限定符的概念性解釋:

如果在類的定義中既不指定private,也不指定public,則系統就預設為是私有的。

被宣告為私有的(private)成員,只能被本類中的成員函式引用,類外不能呼叫(友元類除外)。

被宣告為公用的(public)成員,既可以被本類中的成員函式所引用,也可以被類的作用域內的其他函式引用。

用protected宣告的成員稱為受保護的成員,它不能被類外訪問(這點與私有成員類似),但可以被派生類的成員函式訪問。

其實對於我自己來說,感覺public和private的意義還是比較清楚的,簡潔但不太嚴謹地說,在public繼承的條件下,基類的public函式在子類怎樣都可以被訪問,基類的private函式在子類怎樣都不可以被訪問,那麼問題來了,protected修飾的函式呢?

為了解決這個疑惑,寫了個簡單的小程式試了一下。程式很簡單,大致如下:

class Base
{
protected:
    void protectedFun()
    {
        cout << "Protected fun" << endl;
    }
};

class Derived : public Base
{
public:
    void derivedPublicFun()
    {
        protectedFun();
    }
};

int main(int argc, char *argv[])
{
    Derived derived;
    derived.derivedPublicFun();
    //derived.protectedFun();//Compile Error
    return a.exec();
}

先解釋一下,main函式裡面註釋掉的那句如果開啟註釋的話,會編譯不過,提示:error: ‘void Base::protectedFun()’ is protected

從上面的結果來看,可以看到protected修飾的函式可以被子類的函式訪問,但無法被子類的物件訪問,這樣的話,假如我是Derived類的設計者,我就可以在Derived類的程式碼里根據需求呼叫到Base類裡的protectedFun()。但是如果我把Derived類設計好,實現好以後,relaese出去了,使用這個類的人就無法直接通過構造出來的Derived類的物件訪問到Base類的protectedFun(),藉此達到一種“protected”的機制。

舉個例子,假如有個基類叫Father,代表父親,它有個protected介面叫money(),Father有個子類叫Son,即兒子,兒子有個介面叫buyBook(),buyBook()中可以呼叫到Father中的money(),除了這個寫好的函式以外,Son都是不能呼叫到Father的money()介面的,即爸爸給兒子規定好了,你只有買書來學習可以找我要錢,其他任何理由都不能找我要錢,這樣就可以把爸爸的錢給“保護”起來了~

所以,如果以後有任何成員函式想只讓類的設計者可以使用,就可以將其宣告為protected。