题目要求
有以下程序结构,请分析所有成员在各类的范围内的访问属性。
#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; }