protected成员
可以认为protected访问标号是private 和public 的混合:
1.像private成员一样,protected成员不能被类的用户访问.
2.像public成员一样,protected成员可被该类的派生类访问.
此外,protected还有另一个重要性质:
派生类只能通过派生类对象访问其基类的protected成员,派生类对其基类类型对象的protected成员没有特殊访问权限.
少量的理解:
#include "stdafx.h"
#include<iostream>
using namespace std;
class Ctest
{
public:
Ctest(int a=1,int b=2,int c=3):pub(a),pro(b),pri(c){}
int pub;
void retprotected()
{cout<<pro<<endl;}
protected:
int pro;
void prof(){cout<<"CtestProtected fun"<<endl;}
private:
int pri;
};
class TDer: public Ctest
{
public:
TDer(int a=1,int b =2,int c =3,int d =4):Ctest(a,b,c),Tpri(d)
{
//cout<<pri<<endl;//派生类不能访问积累的private对象
prof();//派生类可以访问基类的protected
}
void retprotected2()
{
//cout<<pri<<endl;//此处不能用,因为不能访问基类的private
cout<<pro<<endl;//派生类可以访问基类的protected
cout<<Tpri<<endl;//访问自身的private
}
private:
int Tpri;
};
int _tmain(int argc, _TCHAR* argv[])
{
TDer Ttest(11,22,33,44);
//cout<<Ttest.pro<<endl;//这里是不可以访问的.和private成员一样,protected成员不能被类的用户访问
return 0;
}
公用、私有和受保护的集成
每个类控制它所定义的成员的访问。派生类可以进一步限制但不能放松对所继承的成员的访问。
无论派生列表中是什么访问标号,所有继承Base的类对Base中的成员具有相同的访问。派生访问标号将控制派生类的用户对从Base继承而来的成员的访问.
class Base
{
public:
void basemem();
protected:
int i;
};
struct Public_derived:public Base
{
int use_base(){return i;}//这里.可以访问基类的protected
};
struct Private_derived:private Base{
int use_base(){return i;}//同样,这样也可以访问i
};
如下:
Base b;
public_derived d1;
Private_derived d2;
b.basemen();//可以
d1.basemem();//可以
d2.basemem();//这是错误的,因为Private_derived是私有继承.导致的事Private_derived中的成员private化了