5、继承同名成员处理方式.cpp 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. //4.6.5 继承同名成员处理方式
  2. //问题:当子类与父类出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据呢?
  3. //⚪访问子类中的同名成员 直接访问即可
  4. //⚪访问父类中的同名成员 需要加作用域
  5. #include <iostream>
  6. class Base
  7. {
  8. public:
  9. Base()
  10. {
  11. m_A = 100;
  12. }
  13. void func()
  14. {
  15. std::cout << "Base - func()调用" << std::endl;
  16. }
  17. void func(int a)
  18. {
  19. std::cout << "Base - func(int a)调用" << std::endl;
  20. }
  21. int m_A;
  22. };
  23. class Son :public Base
  24. {
  25. public:
  26. Son()
  27. {
  28. m_A = 200;
  29. }
  30. void func()
  31. {
  32. std::cout << "Son - func()调用" << std::endl;
  33. }
  34. int m_A;
  35. };
  36. void test01()
  37. {
  38. Son s;
  39. std::cout << "Son m_A = " << s.m_A << std::endl;
  40. //如果通过子类对象 访问到父类中同名成员,需要加作用域
  41. std::cout << "Base m_A = " << s.Base::m_A << std::endl;
  42. }
  43. //同名成员函数处理
  44. void test02()
  45. {
  46. Son s;
  47. s.func(); //直接调用 调用的是子类中的同名成员
  48. //如何调用到父类中的同名成员函数?
  49. s.Base::func();
  50. //如果子类中出现了和父类中同名的成员函数,子类的同名成员会隐藏掉父类中所有同名成员函数
  51. //如果想访问到父类中被隐藏的童名成员函数,需要加作用域
  52. s.Base::func(100);
  53. }
  54. int main()
  55. {
  56. //test01();
  57. test02();
  58. system("pause");
  59. return 0;
  60. }
  61. //总结:
  62. //1、子类对象可以直接访问到子类中的同名成员 s.m_A
  63. //2、子类对象加作用域可以访问到父类同名成员 s.Base::m_A
  64. //3、当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数