C里面的結構體內的成員不受任何機制保護,直接能用,比如StructtypeA.x;StructtypeA.y;StructtypeA.fun();
而c++則不同,c++的類像強化型的結構體
public公有繼承
protected保護繼承
private私有繼承
我們知道類的private和protected成員,在類外是不可以使用的.只有public成員可以在類外直接使用.
公有繼承時,基類的private成員派生類也不可用,基類的public和protected成員在派生類中可直接使用.繼承過來(變成派生類相應的public和protected成員)只有public成員在派生類外可以直接使用.
保護繼承時,基類的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)