C++中三種繼承方式的區別


本文來自https://zhidao.baidu.com/question/159111767.html  詳細說明了三種繼承方式的區別,好文

還可參考另一篇文章:

https://blog.csdn.net/one_super_dreamer/article/details/81611118

https://blog.csdn.net/u011857683/article/details/82120998

public公有繼承

protected保護繼承

private私有繼承

我們知道類的private和protected成員,在類外是不可以使用的.只有public成員可以在類外直接使用.

公有繼承時,基類的private成員派生類也不可用,基類的public和protected成員在派生類中可直接使用.繼承過來(變成派生類相應的public和protected成員)只有public成員在派生類外可以直7a64e58685e5aeb931333262363034接使用.

保護繼承時,基類的private成員仍為有私有.基類的public和protected成員變成派生類的protected成員,這時在派生類外也不能直接使用原基類的public成員

私有繼承時,基類的private成員仍為有私有.基類的public和protected成員將變成派生類的private成員.

舉個例子.

class A

{

public:

   int m_nTelNum;

protected:

   int m_nAge;

private:

   int m_nMoney;

};

class B:public A

{

   void SetTelNum(int nTelNum)

   {

       m_nTelNum=nTelNum;

   }

   void SetAge(int nAge)

   {

       m_nAge=nAge;

   }

   void SetMoney(int nMoney)

   {

       m_nMoney=nMoney;//這里就出現錯誤,因為基類的private成員不能用.

   }

};

B objB;//創建B類的對象objB

objB.m_nTelNum=123456;//可以

objB.m_nAge=30;//錯誤.public繼承中基類的protected在派生類中是protected

objB.m_nMoney=100;//更錯誤,在派生類中都不可以直接使用.在類外就更不能了.

class C:protected A

{

   void SetTelNum(int nTelNum)

   {

       m_nTelNum=nTelNum;

   }

   void SetAge(int nAge)

   {

       m_nAge=nAge;

   }

   void SetMoney(int nMoney)

   {

       m_nMoney=nMoney;//這里就出現錯誤,因為這是基類的private成員不能用.

   }

};

C objC;//創建C類的對象objC

objC.m_nTelNum=123456;//注意這里和public的區別,這里錯誤,m_nTelNum變成了C類的protected成員

objC.m_nAge=30;//錯誤.protected繼承中基類的protected在派生類中是protected,這與public同相

objC.m_nMoney=100;//更錯誤,在派生類中都不可以直接使用.在類外就更不能了.

class D:private A

{

   void SetTelNum(int nTelNum)

   {

       m_nTelNum=nTelNum;

   }

   void SetAge(int nAge)

   {

       m_nAge=nAge;

   }

   void SetMoney(int nMoney)

   {

       m_nMoney=nMoney;//這里就出現錯誤,因為這是基類的private成員不能用.

   }

};

D objD;//創建D類的對象objD

objD.m_nTelNum=123456;//錯誤,m_nTelNum變成了D類的private成員

objD.m_nAge=30;//錯誤.private繼承中基類的protected在派生類中是private

objD.m_nMoney=100;//更錯誤,在派生類中都不可以直接使用.在類外就更不能了.

從例子來看,三種繼承從派生類內部引用來看好像沒有區別,只在類外引用時表現不同.現在還看不出public和protected繼承的區別

那再看一個例子.

class E:public B

{

   void SetTelNum(int nTelNum)

   {

      m_nTelNum=nTelNum;//可以 因為這是B的公有成員

   }

   void SetAge(int nAge)

   {

      m_nAge=nAge;//可以 因為這是B的保護成員,現成變成E的protected成員

   }

   void SetMoney(int nMoney)

   {

      m_nMoney=nMoney;//這個肯定不可以!

   }

};

E objE;//

objE.m_nTelNum=123456;//可以

//其它的兩個就不能用了.

class F:public C

{   

   void SetTelNum(int nTelNum)

   {

      m_nTelNum=nTelNum;//可以 因為這是C的保護成員,這里與public繼承已經有區別但還沒有表現出來

   }

   void SetAge(int nAge)

   {

      m_nAge=nAge;//可以 因為這是C的保護成員,現成變成E的protected成員

   }

   void SetMoney(int nMoney)

   {

      m_nMoney=nMoney;//這個肯定不可以!

   }

};

F objF;

objF.m_nTel=123456;//錯誤,因為這是F的保護成員.注意與E類區別

class G:public D

{

   void SetTelNum(int nTelNum)

   {

      m_nTelNum=nTelNum;//不可以 因為這是D的private成員,注意這里區別

   }

   void SetAge(int nAge)

   {

      m_nAge=nAge;//不可以 因為這是D的private成員,注意區別

   }

   void SetMoney(int nMoney)

   {

      m_nMoney=nMoney;//這個肯定不可以!

   }

};

//那G在類外就沒有了可以引用的繼承過來成員了!

//這些繼承方式是很難理解的.最好的辦法就是多寫代碼去試.

 


免責聲明!

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



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