派生类继承了基类的全部数据成员和除了构造函数,析构函数之外的全部函数成员,但是,这些成员的访问属性在派生过程中是可以调整的。从基类继承的成员,其访问的英文属性由继承方式控制的。
所说这里的访问来自两个方面:一是派生类中的新增成员访问从基类继承的成员,的英文二在派生类的外部(非类族内的成员),通过派生类的对象访问从基类继承的成员。
类的继承方式有:公有继承,私有继承,保护继承
类当继承的方式为公有继承时:
基类的公共成员和受保护成员在派生类中访问属性(大众还是大众,受保护的还是保护的)还是不变,但是在类族之外的派生类的对象只能访问基类的公共成员,受保护和私有成员通过对象都不可以访问。在派生类中,只有基类的私有成员在派生类中不可直接访问。
类当继承的方式为私有继承时:
基类的公用成员和保护成员都以私人身份出现在派生类中,所以在类族之外的派生类的对象不能访问基类的公共和保护的成员,当然包括基类的私有成员。由于继承基类的函数可以说是派生类拥有对基类函数的调用权,所以在派生类中的其他成员可以直接访问基类的公共和保护成员,对于函数,一般采用在函数中调用基类的公共或保护函数的方式访问。
类当继承的方式为保护继承时:
基类的公用成员和保护成员都以保护身份出现在派生类中。在类族之外的派生类的对象和在派生类中的其他成员对于公众,保护,私人的访问权限与私有继承相同。
#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类中继承来的成员。
从继承的访问规则,可以看到类中保护成员的特征。
如果点类中含有保护成员,对于建立点类的对象的模块来讲,保护和该类的私有一样是不可访问的。
如果点类派生出子类长方形,则对于矩形类来讲,保护和公众成员具有像同的访问特性。
换言之,就是点类的保护成员有可能被它的派生类访问,但是绝不可能被其它外部使用者(比如程序中的普通函数,与点类平行的其他类等)访问。
这样,如果合理利用保护成员,就可以在类的复杂层次关系中共享与成员隐蔽之间找到一个平衡点,既能实现成员隐蔽,又能方便继承,实现代码的高效重用和扩充。