继承关系

1.访问控制和继承

在基类中,public和private标号具有普通含义:用户代码可以访问类的public成员而不能访问private成员,private成员只能由基类成员方法和友元方法访问。派生类也没有什么特殊的,和用户代码具有一样的权限:它可以访问public成员但是不可以访问private成员。
还有一种叫做protected成员,它希望允许派生类访问,但是禁止其他用户访问这些成员。protected成员可以被派生类访问,但是不可以被普通用户访问(有一种private和public混合的感觉)。此外需要注意的是,派生类只能通过派生类对象访问基类的protected成员,派生类对其基类类型对象的protected成员没有访问权限。

2.公用、私有和受保护的继承

  • 如果是公用继承,基类成员保持自己的访问级别:基类的public成员为派生类的public成员,基类的protected成员为派生类的protected成员。
  • 如果是受保护继承,基类的public和protected成员为派生类的的protected成员。
  • 如果是私有继承,基类的所有成员在派生类中为private成员。
class Base{
public:
	void basemem();
protected:
	int i;
	//...
};

struct Public_derived : public Base{
	int use_base() {return i;}
};

struct Private_derived : private Base{
	int use_base() {return i;} 
};
无论派生列表中是什么访问标号,所有继承Base的类对Base中的成员具有相同的访问。派生访问标号将控制派生类的用户对从Base继承而来的成员的访问:

Base b;
Public_derived d1;
Private_derived d2;
b.basemem();
d1.basemem();
d2.basemem();     //error
Public_dervied和Private_dervied都继承了basemem函数。当进行public继承时,该成员保持其访问标号,所以,d1可以调用basemem。在Private_dervied中,Base的成员为private,Private_dervied的用户不能调用basemem。

3.using声明

class Base{
public:
	std::size_t size()  const   {return n;}
protected:
	std::size_t n;
};

class Dervied : private Base  {...};
在这一继承层次中,size在Base中为public,但在Derived中为private。为了使size在Derived中成为public,可以在Derived的public部分增加一个using声明。如下这样改变Derived的定义,可以使size成员能够被用户访问,并能使能够被Derived的派生类访问:
class Derivde : private Base{
public:
	using Base::size;
protected:
	using Base::n;
};

4.默认保护继承级别

使用class保留字定义的派生类默认具有private继承,而用struct保留字定义的类默认具有public继承。
class Base{/*...*/};
struct D1 : Base{/*...*/};    //public继承
class D2 : Base{/*...*/};      //private继承

有一种常见的误解认为用struct保留字定义的类与class保留字定义的类有更大的区别。唯一的不同只是默认的成员保护级别和默认的派生类保护级别,并没有其他的区别。

5.友元关系与继承

友元关系不能继承。基类的友元对派生类的成员没有特殊访问权限。如果基类被授予友元权限,则只有基类具有特殊的访问权限,该基类的派生类不能访问授予友元关系的类(即这是一对一的关系)。

6.静态成员与继承

如果基类定义了static成员,则整个继承层次中只有一个这样的成员。无论从基类派生出多少个派生类,每个static成员只有一个实例。如果static成员在基类中为private,则派生类不可以访问它。

7.转换与继承

每个派生类都包含一个基类部分,这意味着可以像使用基类对象一样在派生类对象上执行操作。因为派生类对象也是基类对象 所以存在从派生类型引用到基类型的引用的自动转换,即,可以将派生类对象的引用转换为基类对象的引用,对指针也是如此。
基类类型对象既可以单独存在也可以作为派生类的一部分而存在,因此,一个基类对象可能是也可能不是派生类对象的部分,结果,没用从基类引用到派生类引用的自动转换。
如果是public继承,则用户代码和后代类都可以使用派生类到基类的转换。如果类是使用pivate和protected继承派生的,则用户代码不能将派生类对象转换成基类对象。如果是private继承,则从private继承类派生的类不能转换为基类。如果是protected继承的派生类的成员可以转换为基类对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值