派生类继承了基类的全部数据成员和除了构造函数,析构函数之外的全部函数成员,但是,这些成员的访问属性在派生过程中是可以调整的。从基类继承的成员,其访问的英文属性由继承方式控制的。
所说这里的访问来自两个方面:一是派生类中的新增成员访问从基类继承的成员,的英文二在派生类的外部(非类族内的成员),通过派生类的对象访问从基类继承的成员。
类的继承方式有:公有继承,私有继承,保护继承
类当继承的方式为公有继承时:
基类的公共成员和受保护成员在派生类中访问属性(大众还是大众,受保护的还是保护的)还是不变,但是在类族之外的派生类的对象只能访问基类的公共成员,受保护和私有成员通过对象都不可以访问。在派生类中,只有基类的私有成员在派生类中不可直接访问。
类当继承的方式为私有继承时:
基类的公用成员和保护成员都以私人身份出现在派生类中,所以在类族之外的派生类的对象不能访问基类的公共和保护的成员,当然包括基类的私有成员。由于继承基类的函数可以说是派生类拥有对基类函数的调用权,所以在派生类中的其他成员可以直接访问基类的公共和保护成员,对于函数,一般采用在函数中调用基类的公共或保护函数的方式访问。
类当继承的方式为保护继承时:
基类的公用成员和保护成员都以保护身份出现在派生类中。在类族之外的派生类的对象和在派生类中的其他成员对于公众,保护,私人的访问权限与私有继承相同。
#include<iostream>
using namespace std;
class A
{
private:
int privatetedateA;
protected:
int protecteddateA;
public:
int publicdateA;
};
class B :public A
{
public:
void funct()
{
int b;
b=privatedateA; //error:基类中私有成员在派生类中是不可见的
b=protecteddateA; //true:基类的保护成员在派生类中为保护成员
b=publicdateA; //true:基类的公共成员在派生类中为公共成员
}
};
/
class C :private A
{
public:
void funct()
{
int c;
c=privatedateA; //error:基类中私有成员在派生类中是不可见的
c=protecteddateA; //true:基类的保护成员在派生类中为私有成员
c=publicdateA; //true:基类的公共成员在派生类中为私有成员
}
};
class D :protected A
{
public:
void funct()
{
int d;
d=privatedateA; //error:基类中私有成员在派生类中是不可见的
d=protecteddateA; //true:基类的保护成员在派生类中为保护成员
d=publicdateA; //true:基类的公共成员在派生类中为保护成员
}
};
int main()
{
int a;
B objB;
a=objB.privatedateA; //error:基类中私有s成员在派生类中是不可见的,对对象不可见
a=objB.protecteddateA; //error:基类的保护成员在派生类中为保护成员,对对象不可见
a=objB.publicdateA; //true:基类的公有成员在派生类中为公共成员,对对象可见
C objC;
a=objC.privatedateA; //error:基类中私有成员在派生类中是不可见的,对对象不可见
a=objC.protecteddateA; //error:基类的保护成员在派生类中为私有成员,对对象不可见
a=objC.publicdateA; //error:基类的公有成员在派生类中为私有成员,对对象不可见
D objD;
a=objD.privatedateA; //error:基类中私有成员在派生类中是不可见的,对对象不可见
a=objD.protecteddateA; //error:基类的保护成员在派生类中为保护成员,对对象不可见
a=objD.publicdateA; //error:基类的公有成员在派生类中为保护成员,对对象不可见
return 0;
}
所以私有继承和保护继承的区别是什么呢?
具体体现在派生类继续派生的情况下,假设从左到右继承的三个类:
1.
以上面的方式继承,则Square类不能访问间接从Point类继承来的成员。
以下面的方式继承,则Point类中所有的public和protected成员,被Square类间接继承后,有可能是protected和private的(视从Rectangle类到Square类继承方式不同而不同),因此Square类是有可能访问间接从Point类中继承来的成员。
从继承的访问规则,可以看到类中保护成员的特征。
如果点类中含有保护成员,对于建立点类的对象的模块来讲,保护和该类的私有一样是不可访问的。
如果点类派生出子类长方形,则对于矩形类来讲,保护和公众成员具有像同的访问特性。
换言之,就是点类的保护成员有可能被它的派生类访问,但是绝不可能被其它外部使用者(比如程序中的普通函数,与点类平行的其他类等)访问。
这样,如果合理利用保护成员,就可以在类的复杂层次关系中共享与成员隐蔽之间找到一个平衡点,既能实现成员隐蔽,又能方便继承,实现代码的高效重用和扩充。