c/c++ 繼承與多態 繼承中的public, protected, private


問題:類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
  }
};

c/c++ 學習互助QQ群:877684253

本人微信:xiaoshitou5854


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM