1. 私有成员在派生类中是无权直接访问的,只能通过调用基类中的公有成员函数的方式实现。
2. 一定要直接访问基类中的私有成员,可以把这些成员说明为保护成员protected。一般格式:
Class 类名
{
[private:]
私有成员
protected:
保护成员
public:
公有成员
};
1、不涉及派生时,保护成员与私有成员的地位完全一致。
#include <iostream.h>
//***************************************************
class samp
{
int a;
protected:
int b;
public:
int c;
samp(int n,int m){a=n;b=m;}
int geta(){return a;}
int getb(){return b;}
};
//***************************************************
void main()
{
samp obj(10,20);
// obj.a=11; //Error,私有成员
// obj.b=22; //Error,保护成员
obj.c=33; //Ok
cout<<obj.geta()<<' '<<obj.getb()<<' '<<obj.c<<endl; //Ok
}
输出结果:10 20 33
2、以公有派生时:基类中的保护成员->在派生类中仍是保护的
//基类中的保护成员在公有派生的派生类中仍是保护的
#include <iostream.h>
//**********************************************************
class base{
protected:
int a,b;
public:
void setab(int n,int m){a=n;b=m;}
};
class derive:public base{
int c;
public:
void setc(int n){c=n;}
void showabc(){ cout<<a<<' '<<b<<' '<<c<<endl; }
};
//**********************************************************
void main()
{
derive obj;
obj.setab(2,4); //setab在派生类里仍是公有的,可以访问
obj.setc(3);
obj.showabc();
}
输出结果:2 4 3
3、以私有派生时:基类中的保护成员à在派生类中是私有的。
// 保护性成员在私有派生时,为私有的
#include <iostream.h>
//******************************************************
class base //基类
{
protected:
int a;
public:
void seta(int sa){a=sa;}
};
//drive1中,a、seta都变成私有的成员
class derive1:private base //私有派生类
{
protected:
int b;
public:
void setb(int sb){b=sb;}
};
//derive2中a和seta均为私有的成员,setb仍为公有的,b还是保护的
class derive2:public derive1 //公有派生类
{
int c;
public:
void setc(int sc){c=sc;}
void show()
{
//cout<<a<<endl; //Error(因为a是基类的私有成员,只能通过基类的公有成员来访问)
cout<<"b="<<b<<endl;
cout<<"c="<<c<<endl;
}
};
//******************************************************
void main()
{
base op1;op1.seta(1);
derive1 op2; op2.setb(2);
derive2 op3; op3.setb(2); op3.setc(3); op3.show();
}
输出结果:
b=2
c=3
实际上,私有和保护这两个关键字的性质很相似,一旦用其中一个对类成员进行了定义,那外部对这个类成员是无法访问的,但在涉及到派生时,他们在派生类里的属性就改变了:
保护成员,在公有派生时仍是保护的,在私有派生时,变成私有的了,但派生类可以访问此成员;
而私有成员,在派生时,无论是私有的还是公有的,派生类都不能直接访问此成员,必须通过基类的共有成员来访问。这就是两者的关键性区分。