c++继承与protected

来源:互联网 发布:python 日期格式 编辑:程序博客网 时间:2024/05/22 06:50

继承是面向对象重要的特性,也较为复杂。继承主要的问题是:派生类对基类成员的访问权限。

private和public相信“众所周知”,public成员可以被类的对象、派生类成员访问,而private仅允许本类的成员函数访问。

本文主要解释protected:protected成员和protected继承。

protected成员:希望与派生类共享但拒绝外界直接访问的成员。

protected成员可以看作是public和private的中和体:

1. 具有private成员的一部分性质:不允许直接通过类的对象访问。

2. 具有public成员的一部分性质:派生类可以直接访问基类的protected成员。

当然当这两条性质是protected的最基本性质,但还存在另一条很重要的性质:

3. 派生类成员或友元不能访问基类对象的受保护成员,但可以访问派生类对象的受保护成员(当然公有成员也可以访问),且与继承方式无关。

注意这里强调用对象访问!

举个栗子:

class Base  {  protected:        int i;  private:        int j;  };class derive:public Base  {  public:      int f(derive& s)      {          s.i = 0;    //正确 可以在派生类中通过派生类对象访问基类的受保护成员 但基类私有成员不可访问          return i;      }      int f(Base& s)      {          s.i = 0;    //错误 不能在派生类中访问基类对象的受保护成员          return i;      }  };

继承:

继承的过程:

1. 全盘接受基类的所有成员,但构造函数和析构函数除外。

2. 根据继承方式改变基类成员在派生类中的访问控制权限。

3. 同名覆盖。

4. 添加派生类独有的新成员。

要强调的是:所有继承方式(public,protected,private)不会影响派生类的访问权限,只会改变基类成员在派生类的访问属性。

也就是说,即使是private继承,派生类依然可以访问基类的public和protected成员,只不过原来基类的成员在派生类中变成了private属性。

仍然是刚才的例子:

class Base{public:        int i;protected:        int j;private:        int k;};class derive:private Base{        //......};
derive类使用了私有继承,但该类的成员函数依然可以访问Base类中的成员i和j,同时依然不能访问Base类中的成员k。

private继承和protected继承的区别:

在多重继承中能看出两者的区别,以两次继承为例:

第一次继承如果使用private继承,那么基类的所有成员在子类中均为private,第二次继承时无论何种继承方式,孙类成员函数都不能访问任何子类继承自基类的成员。

但如果第一次继承如果使用protected继承,基类public、protected成员在子类为protected,第二次继承时无论何种继承方式,孙类成员函数能访问子类继承自基类的public和protected成员。

举个栗子:

class Base{public:        int i;protected:        int j;private:        int k;};class derive:protected Base{public:        int m;};class re_derive :private derive    //private继承不影响对基类public和protected成员的访问{public:void f(){                i = 0; j = 0;    //由于第一次继承是protected继承 因此可以访问子类继承自基类的成员i,j                                 //倘若第一次继承是私有继承 i,j将都不可访问}};

参考文献:

[1]Lippman,S.B. & Lajoie,J. & Moo,B.E.著; 王刚 & 杨巨峰译.C++ Primer中文版:第五版[M].北京:电子工业出版社,2013.9:542-544

原创粉丝点击