问题:当子类与父类出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据呢?

  • 访问子类同名成员 直接访问即可
  • 访问父类同名成员 需要加作用域

    同名成员变量

    添加作用域
    1. class Father {
    2. public:
    3. int a = 10;
    4. };
    5. class Son :public Father {
    6. public:
    7. int a = 20;
    8. };
    9. void example() {
    10. Son s1;
    11. cout << "Son s1.a = " << s1.a << endl;
    12. cout << "Father s1.a = " << s1.Father::a << endl;
    13. }

    同名成员函数

    1. #include <iostream>
    2. #include <string>
    3. using namespace std;
    4. class Father {
    5. public:
    6. void func() {
    7. cout << "Father func()" << endl;
    8. }
    9. };
    10. class Son :public Father {
    11. public:
    12. void func() {
    13. cout << "Son func()" << endl;
    14. }
    15. };
    16. void example() {
    17. Son s1;
    18. s1.func();
    19. s1.Father::func();
    20. }
    21. int main() {
    22. example();
    23. return 0;
    24. }
    也是增加作用域
    那么可以总结出三条原则:
  1. 子类对象可以直接访问到子类中同名成员
  2. 子类对象加作用域可以访问到父类同名成员
  3. 当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数

    同名的静态变量

    问题:继承中同名的静态成员在子类对象上如何进行访问?
    静态成员和非静态成员出现同名,处理方式一致
  • 访问子类同名成员 直接访问即可
  • 访问父类同名成员 需要加作用域

示例:

  1. class Base {
  2. public:
  3. static void func()
  4. {
  5. cout << "Base - static void func()" << endl;
  6. }
  7. static void func(int a)
  8. {
  9. cout << "Base - static void func(int a)" << endl;
  10. }
  11. static int m_A;
  12. };
  13. int Base::m_A = 100;
  14. class Son : public Base {
  15. public:
  16. static void func()
  17. {
  18. cout << "Son - static void func()" << endl;
  19. }
  20. static int m_A;
  21. };
  22. int Son::m_A = 200;
  23. //同名成员属性
  24. void test01()
  25. {
  26. //通过对象访问
  27. cout << "通过对象访问: " << endl;
  28. Son s;
  29. cout << "Son 下 m_A = " << s.m_A << endl;
  30. cout << "Base 下 m_A = " << s.Base::m_A << endl;
  31. //通过类名访问
  32. cout << "通过类名访问: " << endl;
  33. cout << "Son 下 m_A = " << Son::m_A << endl;
  34. cout << "Base 下 m_A = " << Son::Base::m_A << endl;
  35. }
  36. //同名成员函数
  37. void test02()
  38. {
  39. //通过对象访问
  40. cout << "通过对象访问: " << endl;
  41. Son s;
  42. s.func();
  43. s.Base::func();
  44. cout << "通过类名访问: " << endl;
  45. Son::func();
  46. Son::Base::func();
  47. //出现同名,子类会隐藏掉父类中所有同名成员函数,需要加作作用域访问
  48. Son::Base::func(100);
  49. }
  50. int main() {
  51. //test01();
  52. test02();
  53. system("pause");
  54. return 0;
  55. }

总结:同名静态成员处理方式和非静态处理方式一样,只不过有两种访问的方式(通过对象 和 通过类名)
::作用域访问符号的意义并不一样