本文來自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在類外就沒有了可以引用的繼承過來成員了!
//這些繼承方式是很難理解的.最好的辦法就是多寫代碼去試.

