主要区别:

  • public继承时,基类的private成员对派生类不可见,基类的public成员、protected成员相应地变成派生类的public、protected成员;
  • private继承时,基类的private成员对派生类不可见,基类的public成员、protected成员变成派生类的private成员;
  • protected继承时,基类的private成员对派生类不可见,基类的public成员、protected成员变成派生类的protected成员。

更详细的访问权限:

访问权限 基类的
public成员
基类的
private成员
基类的
protected成员
基类 类内部 可见 可见 可见
友元(通过基类对象访问) 可见 可见 可见
实例化对象(基类的使用者) 可见 不可见 不可见
派生类内部 public派生类 可见 不可见 可见
private派生类 可见 不可见 可见
protected派生类 可见 不可见 可见
派生类的友元 public派生类 可见 不可见 不可见
private派生类 可见 不可见 不可见
protected派生类 可见 不可见 不可见
派生类的实例化对象 public派生类 可见 不可见 不可见
private派生类 不可见 不可见 不可见
protected派生类 不可见 不可见 不可见

访问权限测试代码:

  1. #include <iostream>
  2. #include <algorithm>
  3. using namespace std;
  4. class A{
  5. friend void print0(const A& a){
  6. cout << a.x1 << a.x2 << a.x3 << endl;
  7. }
  8. public:
  9. int x1;
  10. A():x1(1), x2(2), x3(3){}
  11. private:
  12. int x2;
  13. protected:
  14. int x3;
  15. };
  16. class B: public A{
  17. friend void print1(const A& a){
  18. cout << a.x1 << endl;
  19. //cout << a.x2 << endl;
  20. //cout << a.x3 << endl;
  21. }
  22. public:
  23. B(){
  24. cout << x1 << endl;
  25. //cout << x2 << endl;
  26. cout << x3 << endl;
  27. }
  28. };
  29. class C: private A{
  30. friend void print2(const A& a){
  31. cout << a.x1 << endl;
  32. //cout << a.x2 << endl;
  33. //cout << a.x3 << endl;
  34. }
  35. public:
  36. C(){
  37. cout << x1 << endl;
  38. //cout << x2 << endl;
  39. cout << x3 << endl;
  40. }
  41. };
  42. class D: protected A{
  43. friend void print3(const A& a){
  44. cout << a.x1 << endl;
  45. //cout << a.x2 << endl;
  46. //cout << a.x3 << endl;
  47. }
  48. public:
  49. D(){
  50. cout << x1 << endl;
  51. //cout << x2 << endl;
  52. cout << x3 << endl;
  53. }
  54. };
  55. int main()
  56. {
  57. A a;
  58. a.x1;
  59. //a.x2;
  60. //a.x3;
  61. B b;
  62. b.x1;
  63. //b.x2;
  64. //b.x3;
  65. C c;
  66. //c.x1;
  67. //c.x2;
  68. //c.x3;
  69. D d;
  70. //d.x1;
  71. //d.x2;
  72. //d.x3;
  73. }