protect 继承_(转)public、protect、private继承方式 C++
C里面的結(jié)構(gòu)體內(nèi)的成員不受任何機(jī)制保護(hù),直接能用,比如StructtypeA.x;StructtypeA.y;StructtypeA.fun();
而c++則不同,c++的類像強(qiáng)化型的結(jié)構(gòu)體
public公有繼承
protected保護(hù)繼承
private私有繼承
我們知道類的private和protected成員,在類外是不可以使用的.只有public成員可以在類外直接使用.
公有繼承時(shí),基類的private成員派生類也不可用,基類的public和protected成員在派生類中可直接使用.繼承過(guò)來(lái)(變成派生類相應(yīng)的public和protected成員)只有public成員在派生類外可以直接使用.
保護(hù)繼承時(shí),基類的private成員仍為有私有.基類的public和protected成員變成派生類的protected成員,這時(shí)在派生類外也不能直接使用原基類的public成員
私有繼承時(shí),基類的private成員仍為有私有.基類的public和protected成員將變成派生類的private成員.
舉個(gè)例子.
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; }
//這里就出現(xiàn)錯(cuò)誤,因?yàn)榛惖膒rivate成員不能用.
};
B objB;//創(chuàng)建B類的對(duì)象objB
objB.m_nTelNum=123456;//可以
objB.m_nAge=30;//錯(cuò)誤.
public繼承中基類的protected在派生類中是protected
objB.m_nMoney=100;//更錯(cuò)誤,在派生類中都不可以直接使用.在類外就更不能了.
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; }
//這里就出現(xiàn)錯(cuò)誤,因?yàn)檫@是基類的private成員不能用.
};
C objC;//創(chuàng)建C類的對(duì)象objC
objC.m_nTelNum=123456;//注意這里和public的區(qū)別,這里錯(cuò)誤,m_nTelNum變成了C類的protected成員
objC.m_nAge=30;//錯(cuò)誤.protected繼承中基類的protected在派生類中是protected,這與public同相
objC.m_nMoney=100;//更錯(cuò)誤,在派生類中都不可以直接使用.在類外就更不能了.
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;
//這里就出現(xiàn)錯(cuò)誤,因?yàn)檫@是基類的private成員不能用.
} };
D objD;//創(chuàng)建D類的對(duì)象
objD objD.m_nTelNum=123456;//錯(cuò)誤,m_nTelNum變成了D類的private成員
objD.m_nAge=30;//錯(cuò)誤.private繼承中基類的protected在派生類中是private
objD.m_nMoney=100;//更錯(cuò)誤,在派生類中都不可以直接使用.在類外就更不能了.
從例子來(lái)看,三種繼承從派生類內(nèi)部引用來(lái)看好像沒(méi)有區(qū)別,只在類外引用時(shí)表現(xiàn)不同.現(xiàn)在還看不出public和protected繼承的區(qū)別那再看一個(gè)例子.
class E:public B
{
void SetTelNum(int nTelNum)
{ m_nTelNum=nTelNum;//可以因?yàn)檫@是B的公有成員} void SetAge(int nAge)
{ m_nAge=nAge;//可以因?yàn)檫@是B的保護(hù)成員,現(xiàn)成變成E的protected成員}
void SetMoney(int nMoney) { m_nMoney=nMoney;//這個(gè)肯定不可以! } };
E objE;
objE.m_nTelNum=123456;//可以
//其它的兩個(gè)就不能用了.
class F:public C
{ void SetTelNum(int nTelNum)
{ m_nTelNum=nTelNum;//可以因?yàn)檫@是C的保護(hù)成員,這里與public繼承已經(jīng)有區(qū)別但還沒(méi)有表現(xiàn)出來(lái)}
void SetAge(int nAge) {
m_nAge=nAge;//可以因?yàn)檫@是C的保護(hù)成員,現(xiàn)成變成E的protected成員}
void SetMoney(int nMoney)
{ m_nMoney=nMoney;//這個(gè)肯定不可以! } };
F objF;
objF.m_nTel=123456;//錯(cuò)誤,因?yàn)檫@是F的保護(hù)成員.注意與E類區(qū)別
class G : public D
{
void SetTelNum(int nTelNum)
{ m_nTelNum=nTelNum;//不可以因?yàn)檫@是D的private成員,注意這里區(qū)別}
void SetAge(int nAge)
{ m_nAge=nAge;//不可以因?yàn)檫@是D的private成員,注意區(qū)別}
void SetMoney(int nMoney)
總結(jié)
以上是生活随笔為你收集整理的protect 继承_(转)public、protect、private继承方式 C++的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 红神能不卡武器吗
- 下一篇: c语言输出11258循环,c/c++内存