1.)在一个base类中,访问标号可以是 public,protected,private,以关键字class声明,缺省访问属性为private,而以struct声明,缺省为public。
2.)对于public,可以在类外访问,可以再类内访问。private,可以在类内访问。protected,可以由类内,友元访问,不能由类的用户(类外)访问。另外一点不同在于。当设计继承时,如果省略继承方式,class默认private,struct为public。
3.)继承。继承方式有三种:private,protected,public。对于private继承,在派生类中,基类中的private不可访问,基类的public,protected,均在派生类中指定为private访问类型。对于 protected继承,基类中的private在派生类中仍不可见,基类中的protected,public在派生类中均为protected,类似的,在public继承中,基类的private不可见,protected,public分别为原有访问权限。
派生类可以进一步限制,但不能放松对所继承基类成员的访问。如果成员在基类中为private,则只有基类和基类的友元可以对其访问,不能通过派生访问基类private。 派生类可以恢复继承成员的访问级别,但不能使访问级别比基类中原来指定的更严格或宽松。例如,在通过private继承的基类base中有protected成员int a;,public的int b;和private的int c;可以在派生类der的protected部分使用: using base::a;而不能使用:using base::b,或using base::c;但要注意。继承自基类private的,在派生类中不可访问的成员,不能通过using方式恢复可见。
如果因为继承,使得基类中的private在派生类中不可见,可以在基类中声明一个操作该private的成员函数。在派生类中调用该成员函数可以间接的修改派生类中不可见的来自基类的private。
可参考下列代码。
#include <iostream>
#include <string>
using namespace std;
class base{
private:int pri1;
protected:string pro1 ;
public:int pub1;
void show();
};
void base::show(){
cout <<"base private pri1:"<< pri1 << " base protected pro1:" << pro1 << " base public pub1:" <<pub1<< endl;
}
class deri1:public base{//public继承
private:int pri2;
protected:string pro2;
public:int pub2;
void show(){
/*cout //<< "base private pri1:" << pri1//继承自base的private对派生类不可访问。
<< " base protected pro1:"
<< pro1 << " base public pub1:"<<pub1
<< endl;
}*/ //可以通过调用base类中的show(),pri1对deri1不可见,但对base可见,所以可以使用base的show()实现。
base::show();
cout << "base private pri2:" << pri2
<< " base protected pro2"<< pro2
<< " base public pub2:" << pub2
<< endl;
}
};
class deri2 :base{//class,缺省以private方式继承。
private:int pri3;
//using base::pri1;//error!
protected:string pro3;
using base::pro1;
public:int pub3;
using base::pub1;
};