保护成员的声明,
保护成员用关键字protected声明,
它可以放在类声明的任何地方,
通常放在私有成员和公有成员之间,
------------------------------------------------------------
其声明的一般形式为:
class 类名
{
private:
//私有成员
protected:
//保护成员
public:
//公有成员
};
----------------------------------------------------------------
例如,下面程序创建类Base的对象ob,
在使用该对象访问类中的私有成员和保护成员时需要通过公有函数来实现。
#include <iostream>
using namespace std;
class Base
{
private://-------------定义私有成员
int a;
protected:
int b;//------------声明b为保护成员
public:
int c;
void setab(int x, int y)
{
a = x;//----------给私有成员赋值
b = y;//----------给保护成员赋值
}
int geta()
{
return a;
}
int getb()
{
return b;
}
};
int main()
{
Base ob;
//ob.a=10;//-----------非法,外部函数不能访问类的私有成员
//ob.b=20;//-----------非法,外部函数不能访问类的保护成员
ob.c = 30;//-----------合法,类函数能访问类的公有成员
cout << ob.geta() << " " << ob.getb() << " " << ob.c << endl;
ob.setab(10,20);//------------通过调用公有成员函数给私有和保护数据成员赋值
cout << ob.geta() << " " << ob.getb() << " " << ob.c << endl;
system("pause");
return 0;
}
---------------------------------------------------------------------------------------------------------------
运行结果:
------------------------------------------------------------------------------------------
在上述代码主函数main()中,
由类Base创建了对象ob直接访问私有成员a和保护成员b都是非法的。
如果要访问私有成员和保护成员,
必须通过公有成员函数来访问,
上述示例是通过setab()成员函数来实现的。
了解保护成员的概念后,
再来看保护成员被继承后访问特性的变化。
由于继承的方式不同,
----------------------------------------------------------------------------------
因此保护成员被继承后其访问特性相应如下:
1.若为公有继承,
则基类中的保护成员在派生类中也为保护成员,
可被派生类直接访问,
但不能被外部函数直接访问,
外部函数只能通过派生类的对象间接访问它们。
2.若为私有继承,
则基类中的保护成员在派生类中成为私有成员,
派生类可直接访问它们,
但外部函数或在类外通过派生类的对象都不能访问它们。