公有继承 保护继承 私有继承

转自:http://zhidao.baidu.com/question/159111767.html

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)
   {
      m_nMoney=nMoney;//这个肯定不可以!
   }
};//
//那G在类外就没有了可以引用的继承过来成员了!
//这些继承方式是很难理解的.最好的办法就是多写代码去试.

对于private类型的成员变量,无论是公有继承还是私有继承,在派生类中定义的成员函数都不能直接访问基类的私有成员,只能通过基类的public或protect成员函数访问。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值