c/c++ 繼承與多型 繼承中的public, protected, private
阿新 • • 發佈:2018-12-30
問題:類B私有繼承類A,類A有個protected成員,那麼在類B的成員函式裡是否可以使用類A的protected成員?
可以使用。
估計有的同學說不對吧,類B都私有繼承了類A了,怎麼還能訪問類A的protect成員呢?請看下面的例子。在類Pri_derv的f()成員函式裡是可以方位父類Base的pub_mem();和prot_mem;的。
class Base{ public: void pub_mem(); protected: int prot_mem; private: char pri_mem; }; class Pub_derv : public Base{ int f(){ pub_mem(); return prot_mem; } //char g(){return pri_mem;}//error }; class Pri_derv : private Base{ int f(){ pub_mem(); return prot_mem; } };
所以,子類不管是以什麼方式繼承父類,父類的public成員和protected成員在子類裡永遠都是可以訪問的。
那麼,public,protected,private繼承都有什麼用途呢?
控制它的子類,或者使用它的類,可以訪問哪些成員變數。
- public繼承:原來父類的public,protected,private成員在子類裡保持不變。
- protected繼承:原來父類的public成員在子類裡變成protected的了,其餘不變,所以,當別的類使用這個子類, 或者另一個類繼承這個子類時候,這個子類的父類的public就不能被訪問了。
- private繼承:原來父類所以成員在子類裡都變成private的了,所以,當別的類使用這個子類, 或者另一個類繼承這個子類時候,這個子類的父類的public就不能被訪問了。
類Pri_derv私有繼承Base,所以在Pri_derv的成員方法裡是可以訪問Base的public,protected成員的;但是Base的public,protected成員在類Pri_derv裡已經是私有的了,所以當Pri_Pri_derv繼承Pri_derv,在Pri_Pri_derv的成員方法裡是不能再訪問Base的public,protected成員。
class Base{ public: void pub_mem(); protected: int prot_mem; private: char pri_mem; }; class Pub_derv : public Base{ int f(){ pub_mem(); return prot_mem; } //char g(){return pri_mem;}//error }; class Pri_derv : private Base{ int f(){ pub_mem(); return prot_mem; } }; class Pub_Pub_derv : public Pub_derv{ int f(){ pub_mem(); return prot_mem; } //char g(){return pri_mem;}//error }; class Pri_Pri_derv : private Pri_derv{ int f(){ pub_mem();//error return prot_mem;//error } };