標籤:
首先我們都知道對於基類的私人資料或者介面,不論是何種的繼承,這個資料永遠屬於這個基類,只有這一份屬於這個基類所定義的對象,當然對於這個基類的對象這個資料可以有多份,但是對於類外的其他類來說就是只有一份,永遠不能給衍生類別共用。衍生類別只能通過基類的方法進行訪問。(這裡首先不對友員函數進行討論,暫時忽略)
其次對於所有的資料如果使用私人繼承,無論資料或介面在基類中的訪問屬性是什麼,在經過這個私人繼承之後就會全變成基類的私人成員
下來對於基類的公有資料如果使用公有屬性就會還是在衍生類別中是公有屬性,如果使用保護繼承就會變成衍生類別中的保護屬性,就是只能在衍生類別中使用公有介面才可以訪問
對於基類的保護資料如果使用公有繼承就還是在衍生類別中是保護屬性,如果使用保護繼承還是保持自身不變
下來說一說各種的繼承方式,對於私人繼承就是好比告訴衍生類別我這邊的東西(資料或者介面)只有我這一份,你想COPY,不給,但是我可以允許你在讀或者寫操作時候通過我給你提供的資料介面進行操作。對於保護繼承就是告訴衍生類別我這邊這個東西(資料或者介面)我可以拷貝一份給你,但是你必須珍惜這個我給你的東西,並且我的這些資料的存取權限你也不能更改,一定過去把他也保護起來。對於公有繼承就是我公開的所有的並且也給你,你過去也必須將這些公開,但是我的資料原本的屬性不可以更改。
再說一說保護資料與私人資料。在設計的時候已經考慮到了,為了維護資料安全和共用就是出現了在公有資料與私人資料之間的一種保護資料,私人資料是只有自己類中一份,其他類想使用先要我同意才可以,必須走我的介面,而保護資料是繼承類中可以和積累共同享用的私人資料,就是無論我被派生多少次,我的心還是不變我還是在你使用我的時候作為你的私人資料,哎呦,說的有點煽情了!!!
前面我們知道對於公有的繼承所有的基類公有介面也是衍生類別的公有介面,可以直接使用衍生類別中的對象直接調用基類的介面,但是保護繼承所有的基類公有介面就會變成衍生類別中保護類型,這樣衍生類別對象可以通過衍生類別中的公有介面訪問基類的公有介面,還有對於私人繼承,基類中的公有介面就會變成衍生類別中的私人資料,必須通過衍生類別的公有介面訪問基類的公有介面(這裡我只說找類的介面沒有說找類的資料是因為找到介面,資料肯定找到)
所以下面我說的訪問聲明就是針對上面的保護繼承和私人繼承中訪問基類的公有介面麻煩的解決,這樣可以減少衍生類別中在構造一個公有函數來訪問基類的公有介面,下面只以私人繼承為例其實保護繼承是一樣的
/********************************************************************** * * Copyright (c)2015,WK Studios * * Filename: A.h * * Compiler: GCC vc 6.0 * * Author:WK * * Time: 2015 26 6 * **********************************************************************/ #include <iostream>using namespace std;class A{public:A(int x=int(),int x1=int(),int x2=int()):p_data(x),data(x1),m_data(x2){}void show(int x)const{cout<<data+m_data-x<<"\n";}void show(){cout<<"data of protected: "<<data<<" data of private: "<<m_data<<"\n";}int p_data;protected:int data;private:int m_data;};//想要在私人繼承中訪問基類的公有資料與介面,可以使用訪問聲明,只給聲明的資料或介面一個後門可以訪問,保護了資料的安全性class B :private A{public: B(int x=int(),int x1=int(),int x2=int()):A(x,x1,x2){}A::show;//這隻是以函數名作為重載函數的匹配到函數,注意這裡只需要函數名A::data;//資料與函數原來是什麼訪問屬性使用訪問聲明之後在衍生類別中還是原來的屬性};void main(){ B b1(1,2,3); b1.show(); b1.show(1); cout<< b1.data<<endl; ; }
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
C++資料訪問聲明的思考