/*
3.保护继承的访问规则
当类的继承方式为保护继承时,基类的公有成员和保护成员被继承到派生类中都作为
派生类的保护成员,派生类的其他成员可以直接访问它们,但是在类的外部,不能通过派生
类的对象来访问它们。基类的私有成员不允许派生类继承,因此在私有派生类中是不可直
接访问的,所以无论是派生类成员还是通过派生类的对象,都无法直接访问基类的私有成
员。表4.4总结了保护继承的访问规则。
表4.4 保护继承的访问规则
----------------------------------------------------------
基类中的成员 | 私有成员 | 公有成员 | 保护成员 |
----------------------------------------------------------
|内部访问 | 不可访问 | 可访问 | 可访问 |
访问方式| | | | |
|对象访问 | 不可访问 | 不可访问 | 不可访问 |
----------------------------------------------------------
*/
// 例4.4 保护继承的访问规则举例。
#include<iostream>
using namespace std;
class Base{ //声明基类Base
public:
int z;
void setx(int i){
x = i;
}
int getx(){
return x;
}
private:
int x;
protected:
int y;
};
class Derived:protected Base{ //声明基类Base的保护派生类Derived
public:
int p;
void setall(int a,int b,int c,int d,int e,int f);
void show();
private:
int m;
protected:
int n;
};
void Derived::setall(int a,int b,int c,int d,int e,int f){
x=a; //错误,在派生类Derived中,x为不可直接访问成员
//可修改为 setx(a);
y=b; //正确,y在派生类Derived中为保护成员,派生类对象能访问它
z=c; //正确,z在派生类Derived中为保护成员,派生类对象能访问它
m=d;
n=e;
p=f;
}
void Derived::show(){
cout<<"x="<<x<<endl; //错误,在派生类Derived中,x为不可直接访问成员
cout<<"x="<<getx()<<endl; //正确,函数getx在派生类Derived中为保护成员
//派生类成员函数能访问它
cout<<"y="<<y<<endl; //正确,y在派生类Derived中为保护成员
//派生类成员函数能访问它
cout<<"z="<<z<<endl; //正确,z在派生类Derived中为保护成员
//派生类成员函数能访问它
cout<<"m="<<m<<endl; //正确,m为派生类Derived的私有成员
//派生类成员函数能访问它
cout<<"n="<<n<<endl; //正确,n为派生类derived的保护成员,派生类成员函数能访问它
}
int main(){
Derived obj;
obj.setall(1,2,3,4,5,6);
obj.show();
cout<<"y="<<obj.y<<endl; //错误,y为派生类Derived的保护成员,派生类对象不能访问它
cout<<"p="<<obj.p<<endl; //正确,p为派生类derived的公有成员,派生类对象可以访问它
return 0;
}
/*
例中派生类Derived有基类Base保护派生出来,所以基类Base中的私有数据成员x在
保护派生类Derived中是不可直接访问成员,因此派生类成员函数setall和show不能访问
它。基类Base中的保护数据成员y在保护派生类Derived中仍是保护成员,因此派生类成
员函数setall和show能够访问它,但是派生类Derived的对象obj不能访问它。派生类
Derived的数据成员p是公有成员,所以派生类Derived的对象obj可以访问它。
如果将例中派生类Derived的成员函数Derived::setall改成如下形式:
void Derived:setall(int a,int b,int c,int d,int e,int f){
setx(a);
y=b;
z=c;
m=d;
n=e;
p=f;
}
并且去掉主函数main和Derived::show中的错误语句,重新编译后程序将顺利通过。
修改后,本程序运行结果如下:
x=1
y=2
z=3
m=4
n=5
p=6
*/
例4.4 保护继承的访问规则举例
最新推荐文章于 2025-01-03 16:18:30 发布