题目要求
有以下程序结构,请分析所有成员在各类的范围内的访问属性。
#include <iostream>
using namespace std;
class A
{public:
void f1( );
protected:
void f2();
private:
int i;
};
class B: public A
{public:
void f3( );
int k;
private:
int m;
};
class C: protected B
{public:
void f4();
protected:
int n;
private:
int p;
};
class D: private C
{public:
void f5();
protected:
int q;
private:
int r;
};
int main()
{A a1;
B b1;
C c1;
D d1;
return 0;
}
——谭浩强的《C++面向对象程序设计》第5章习题第6小题
分析
在基类的访问属性 | 继承方式 | 在派生类的访问属性 |
---|---|---|
private | public | 不可访问 |
private | private | 不可访问 |
private | protected | 不可访问 |
public | public | public |
public | private | private |
public | protected | protected |
protected | public | protected |
protected | private | private |
protected | protected | protected |
根据成员在基类的访问属性和继承方式,可以得到成员在派生类的访问属性。
成员 | 在A类的属性 | 在B类的属性 | 在C类的属性 | 在D类的属性 |
---|---|---|---|---|
f1 | public | public | protected | pricate |
f2 | protected | protected | protected | private |
i | private | 不可访问 | 不可访问 | 不可访问 |
f3 | - | public | protected | private |
k | - | public | protected | private |
m | - | private | 不可访问 | 不可访问 |
f4 | - | - | public | private |
n | - | - | protected | private |
p | - | - | private | 不可访问 |
f5 | - | - | - | public |
q | - | - | - | protected |
r | - | - | - | private |
上机验证
// https://blog.csdn.net/weixin_43470383/article/details/110492612
#include <iostream>
using namespace std;
class A
{
public:
void f1(); // 在B、C和D类中都可以访问
protected:
void f2(); // 在B、C和D类中都可以访问
private:
int i; // 在B、C和D类中都不可以访问
};
class B : public A
{
public:
void f3()
{
f1(); // 可以访问公用基类的公用成员函数
f2(); // 可以访问公用基类的保护成员函数
// i = 5; // 不可访问公用基类的私有成员
};
int k; // 在C和D类中都可以访问
private:
int m; // 在C和D类中都不可以访问
};
class C : protected B
{
public:
void f4()
{
f1(); // 可以访问保护基类的公用成员函数
f2(); // 可以访问保护基类的保护成员函数
f3(); // 可以访问保护基类的公用成员函数
// i = 5; // 不可访问
k = 5; // 可以访问保护基类的公用成员
// m = 5; // 不可访问保护基类的私有成员
}
protected:
int n; // 在D类中可以访问
private:
int p; // 在D类中不可以访问
};
class D : private C
{
public:
void f5()
{
f1(); // 可以访问私有基类的公用成员函数
f2(); // 可以访问私有基类的保护成员函数
f3(); // 可以访问私有基类的公用成员函数
f4(); // 可以访问私有基类的公用成员函数
// i = 5; // 不可访问
k = 5; // 可以访问私有基类的公用成员
// m = 5; // 不可访问
n = 5; // 可以访问私有基类的保护成员
// p = 5; // 不可访问私有基类的私有成员
}
protected:
int q;
private:
int r;
};
int main()
{
A a1;
B b1;
C c1;
D d1;
return 0;
}