6、继承同名静态成员处理方式.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. //4.6.6 继承同名静态成员处理方式
  2. //问题:继承中同名静态成员在子类对象上如何进行访问?
  3. //静态成员和非静态成员出现同名,处理方式一致
  4. //⚪访问子类同名成员 直接访问即可
  5. //⚪访问父类同名成员 需要加作用域
  6. #include <iostream>
  7. class Base
  8. {
  9. public:
  10. static int m_A;
  11. static void func()
  12. {
  13. std::cout << "Base - static void func()" << std::endl;
  14. }
  15. static void func(int a)
  16. {
  17. std::cout << "Base - static void func(int a)" << std::endl;
  18. }
  19. };
  20. int Base::m_A = 100;
  21. class Son :public Base
  22. {
  23. public:
  24. static int m_A;
  25. static void func()
  26. {
  27. std::cout << "Son - static void func()" << std::endl;
  28. }
  29. };
  30. int Son::m_A = 200;
  31. //同名静态成员属性
  32. void test01()
  33. {
  34. //1、通过对象访问
  35. std::cout << "通过对象访问" << std::endl;
  36. Son s;
  37. std::cout << "Son m_A = " << s.m_A << std::endl;
  38. std::cout << "Base m_A = " << s.Base::m_A << std::endl;
  39. //2、通过类名访问
  40. std::cout << "通过类名访问" << std::endl;
  41. std::cout << "Son m_A = " << Son::m_A << std::endl;
  42. //第一个::代表通过类名方式访问 第二个::代表通过父类作用域下的 m_A
  43. std::cout << "Base m_A = " << Son::Base::m_A << std::endl;
  44. }
  45. //同名静态成员函数
  46. void test02()
  47. {
  48. //1、通过对象访问
  49. std::cout << "通过对象访问" << std::endl;
  50. Son s;
  51. s.func();
  52. s.Base::func();
  53. //2、通过类名访问
  54. std::cout << "通过类名访问" << std::endl;
  55. Son::func();
  56. Son::Base::func();
  57. //子类出现和父类同名静态成员函数,也会隐藏父类中所有同名成员函数
  58. //如果想访问父类中被隐藏同名成员,需要加作用域
  59. Son::Base::func(100);
  60. }
  61. int main()
  62. {
  63. //test01();
  64. test02();
  65. system("pause");
  66. return 0;
  67. }
  68. //同名静态成员处理方式和非静态处理方式一样,只不过有两种访问的方式(通过对象 和 通过类名)