1. 程式人生 > >c/c++ 繼承與多型 繼承中的public, protected, private

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