1. 程式人生 > 實用技巧 >C++中類繼承public,protected和private關鍵字作用詳解及派生類的訪問許可權

C++中類繼承public,protected和private關鍵字作用詳解及派生類的訪問許可權

注意:本文有時候會用Visual Studio Code裡外掛的自動補全功能來展示訪問許可權的範圍(當且僅當自動補全範圍等價於物件訪問許可權範圍的時候),但是不代表只要是出現在自動補全範圍內的可呼叫物件/成員都是合法的。

一,公有繼承

#include<cstdio>
#include<iostream>
#include<string>
#include<algorithm>
#include<vector> class Base{
public:
int PublicBase;
void PublicPrint() {std::cout << "PublicPrint()" << std::endl;}
protected:
int ProtectedBase;
void ProtectedPrint() {std::cout << "ProtectedPrint()" << std::endl;}
private:
int PrivateBase;
void PrivatePrint() {std::cout << "PrivatePrint()" << std::endl;}
}; class Derived : public Base{
public:
void DerivedPrint() {
std::cout << "DerivedPrint()" << std::endl;
std::cout << ProtectedBase << std::endl;
//若要訪問protected的資料成員需要通過派生類裡的成員函式訪問
PublicPrint();
ProtectedPrint();
}
}; int main(void)
{
Derived der;
der.PublicPrint();
der.PublicBase;
//der.ProtectedBase; //不能直接訪問protected資料成員
//der.ProtectedPrint();//意思同上
return ;
}

  公有繼承的派生類可以直接訪問基類的public中的資料成員和成員函式,不能直接訪問protected中的資料成員和成員函式,若要訪問protected的資料成員需要通過派生類裡的成員函式訪問。基類裡的private成員函式及資料成員派生類是沒有訪問許可權的。但是我們可以通過間接呼叫Base::function()來訪問Base類裡的private物件。

派生類成員函式的訪問許可權一覽:

使用者的訪問許可權一覽(非常顯然了):

其實再添幾行程式碼,很容易知道Derived的派生類訪問許可權(SeconedDerived類是Derived的公有繼承):

二,保護繼承

部分程式碼改變如下:

class Derived : protected Base{
public:
void DerivedPrint() {
std::cout << "DerivedPrint()" << std::endl;
std::cout << ProtectedBase << std::endl;
//若要訪問protected的資料成員需要通過派生類裡的成員函式訪問
PublicPrint();
ProtectedPrint();
}
};

通常保護繼承的派生類訪問基類成員的許可權和公有繼承的派生類訪問基類成員的許可權相同,保護繼承的派生類物件訪問父類成員的許可權和私有繼承子類物件訪問父類成員的許可權相同。(der是Derived例項)

可以看出派生類的訪問許可權並沒有什麼改變。但是派生類會將所有從基類繼承的成員全部放到protected下。不多贅述。

三,私有繼承

部分程式碼改變如下:

class Derived : private Base{
public:
void DerivedPrint() {
std::cout << "DerivedPrint()" << std::endl;
}
};

私有繼承的過程中,基類中的public和protected屬性的成員在派生類中雖然能被訪問,但是其屬性在派生類中被降級為private,可以當作Derived類的private來訪問。