(转)public、protect、private继承方式 C++

时间:2014-05-06 00:42:19   收藏:0   阅读:511

C里面的结构体内的成员不受任何机制保护,直接能用,比如StructtypeA.x;StructtypeA.y;StructtypeA.fun();

而c++则不同,c++的类像强化型的结构体

 

 

 

public公有继承

protected保护继承

private私有继承

 

我们知道类的privateprotected成员,在类外是不可以使用的.只有public成员可以在类外直接使用.

 

公有继承时,基类的private成员派生类也不可用,基类的publicprotected成员在派生类中可直接使用.继承过来(变成派生类相应的publicprotected成员)只有public成员在派生类外可以直接使用.

 

保护继承时,基类的private成员仍为有私有.基类的publicprotected成员变成派生类的protected成员,这时在派生类外也不能直接使用原基类的public成员

 

 

私有继承时,基类的private成员仍为有私有.基类的publicprotected成员将变成派生类的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;//更错误,在派生类中都不可以直接使用.在类外就更不能了.

 

 

 

 

 

从例子来看,三种继承从派生类内部引用来看好像没有区别,只在类外引用时表现不同.现在还看不出publicprotected继承的区别 那再看一个例子.

class E:public B

{

void SetTelNum(int nTelNum)

{ m_nTelNum=nTelNum;//可以 因为这是B的公有成员 } void SetAge(int nAge)

{ m_nAge=nAge;//可以 因为这是B的保护成员,现成变成Eprotected成员 }

 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的保护成员,现成变成Eprotected成员 }

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;//不可以 因为这是Dprivate成员,注意这里区别 }

void SetAge(int nAge)

{ m_nAge=nAge;//不可以 因为这是Dprivate成员,注意区别 }

void SetMoney(int nMoney)  

 

 

bubuko.com,布布扣

(转)public、protect、private继承方式 C++,布布扣,bubuko.com

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!