• 【C++基础入门】39.C++中不同的继承方式


    文章目录

    一、被忽视的细节

    二、有趣的问题

    三、不同的继承方式

    四、遗憾的事实

    五、小结


    一、被忽视的细节

            冒号(∶)表示继承关系,Parent 表示被继承的类,public 的意义是什么?
     

    二、有趣的问题

            是否可以将继承语句中的 public 换成 protected 或者 private ? 如果可以,与  public 继承有什么区别?  

            下面来进行一个尝试:

    1. #include
    2. #include
    3. using namespace std;
    4. class Parent
    5. {
    6. };
    7. class Child_A : public Parent
    8. {
    9. };
    10. class Child_B : protected Parent
    11. {
    12. };
    13. class Child_C : private Parent
    14. {
    15. };
    16. int main()
    17. {
    18. return 0;
    19. }

            编译也是能够正常通过的。

    三、不同的继承方式

    • C++ 中支持三种不同的继承方式
      • public 继承
        • 父类成员在子类中保持原有访问级别
      • private 继承
        • 父类成员在子类中变为私有成员
      • protected 继承
        • 父类中的公有成员变为保护成员,其它成员保持不变

            用一张表来总结,就是:

            继承成员的访问属性 = Max {继承方式父类成员访问属性}

            C++ 中的默认继承方式为 private !

            下面来看一个继承与访问级别的代码:

    1. #include
    2. #include
    3. using namespace std;
    4. class Parent
    5. {
    6. protected:
    7. int m_a;
    8. protected:
    9. int m_b;
    10. public:
    11. int m_c;
    12. void set(int a, int b, int c)
    13. {
    14. m_a = a;
    15. m_b = b;
    16. m_c = c;
    17. }
    18. };
    19. class Child_A : public Parent
    20. {
    21. public:
    22. void print()
    23. {
    24. cout << "m_a" << m_a << endl;
    25. cout << "m_b" << m_b << endl;
    26. cout << "m_c" << m_c << endl;
    27. }
    28. };
    29. class Child_B : protected Parent
    30. {
    31. public:
    32. void print()
    33. {
    34. cout << "m_a" << m_a << endl;
    35. cout << "m_b" << m_b << endl;
    36. cout << "m_c" << m_c << endl;
    37. }
    38. };
    39. class Child_C : private Parent
    40. {
    41. public:
    42. void print()
    43. {
    44. cout << "m_a" << m_a << endl;
    45. cout << "m_b" << m_b << endl;
    46. cout << "m_c" << m_c << endl;
    47. }
    48. };
    49. int main()
    50. {
    51. Child_A a;
    52. Child_B b;
    53. Child_C c;
    54. a.m_c = 100;
    55. b.m_c = 100; // child_B 保护继承自 Parent,所以所有的 public 成员全部变成了 protected 成员,因此外界无法访问
    56. c.m_c = 100; // child_C 保护继承自 Parent,所以所有的成员全部变成了 private 成员,因此外界无法访问
    57. return 0;
    58. }

             编译会报错,这是因为 child_B 保护继承自 Parent,所以所有的 public 成员全部变成了 protected 成员,因此外界无法访问;child_C 保护继承自 Parent,所以所有的成员全部变成了 private 成员,因此外界无法访问

             再来进一步看看:

    1. #include
    2. #include
    3. using namespace std;
    4. class Parent
    5. {
    6. protected:
    7. int m_a;
    8. protected:
    9. int m_b;
    10. public:
    11. int m_c;
    12. void set(int a, int b, int c)
    13. {
    14. m_a = a;
    15. m_b = b;
    16. m_c = c;
    17. }
    18. };
    19. class Child_A : public Parent
    20. {
    21. public:
    22. void print()
    23. {
    24. cout << "m_a" << m_a << endl;
    25. cout << "m_b" << m_b << endl;
    26. cout << "m_c" << m_c << endl;
    27. }
    28. };
    29. class Child_B : protected Parent
    30. {
    31. public:
    32. void print()
    33. {
    34. cout << "m_a" << m_a << endl;
    35. cout << "m_b" << m_b << endl;
    36. cout << "m_c" << m_c << endl;
    37. }
    38. };
    39. class Child_C : private Parent
    40. {
    41. public:
    42. void print()
    43. {
    44. cout << "m_a" << m_a << endl;
    45. cout << "m_b" << m_b << endl;
    46. cout << "m_c" << m_c << endl;
    47. }
    48. };
    49. int main()
    50. {
    51. Child_A a;
    52. Child_B b;
    53. Child_C c;
    54. a.m_c = 100;
    55. //b.m_c = 100; // child_B 保护继承自 Parent,所以所有的 public 成员全部变成了 protected 成员,因此外界无法访问
    56. //c.m_c = 100; // child_C 保护继承自 Parent,所以所有的成员全部变成了 private 成员,因此外界无法访问
    57. a.print();
    58. b.print();
    59. c.print();
    60. a.set(1, 1, 1);
    61. b.set(2, 2, 2);
    62. c.set(3, 3, 3);
    63. return 0;
    64. }

             会报如下错误:

            a.print(); b.print();  c.print();  没有报错,说明了 继承方式仅仅影响的是父类中的子成员在子类中的访问属性,对于子类重新定义的成员没有任何的影响

            b.set(2, 2, 2); c.set(3, 3, 3);  报错,这是因为 set 函数在 b 里面变成了 protected 成员,在 c 里面变成了 private 成员,因此在 main 函数中无法被调用。

    四、遗憾的事实

    • 一般而言,C++ 工程项目中只使用 public 继承
    • C++ 的派生语言只支持一种继承方式( public 继承)
    • protectedprivate 继承带来的复杂性远大于实用性

    五、小结

    • C++中支持 3 种不同的继承方式
    • 继承方式直接影响父类成员在子类中的访问属性
    • 一般而言,工程中只使用 public 的继承方式
    • C++ 的派生语言中只支持 public 继承方式
  • 相关阅读:
    文本的换行与包裹 之可能是全网最详细的 line-break 中文介绍
    RFID资产管理解决方案
    SLAM中的子图
    【Java SE】封装的详解
    C++异常
    缓解缓存击穿的大杀器之---singleflight深入浅出
    爬虫的异常处理办法
    “注释: 爱恨交织的双重标准?解析注释在代码开发中的作用。”
    明日风尚杂志明日风尚杂志社《明日风尚》杂志社2022年第10期目录
    Hadoop集群资源管理器-YARN
  • 原文地址:https://blog.csdn.net/weixin_43129713/article/details/125988589