zoukankan      html  css  js  c++  java
  • 17. 继承之同名处理

    五、继承同名成员处理方式

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

    • 访问子类同名成员,子类对象直接访问即可
    • 访问父类同名成员,子类对象需要加作用域
    • 如果子类中出现和父类同名的成员函数,子类的同名成员,会隐藏掉父类中所有同名成员函数,如果想访问被隐藏的同名成员函数,加上作用域即可
    #include <iostream>
    using namespace std;
    class Base
    {
    public:
          Base()
          {
                m_a = 10;
          }
          int m_a;
          void func()
          {
                cout << "Base - func()调用" << endl;
          }
    };
    class Son : public Base
    {
    public:
          Son()
          {
                m_a = 100;
          }
          int m_a;
          void func()
          {
                cout << "Son - func()调用" << endl;
          }
    };
    // 同名的成员属性
    void test01()
    {
          Son s;
          cout << "Son 下 m_a" << s.m_a << endl;
          cout << "Base 下 m_a" << s.Base::m_a << endl; //如果通过子类对象,访问到父类中同名成员,需要加作用域
    }
    //同名成员函数处理
    void test02()
    {
          Son s;
          s.func(); // 直接调用子类中的同名成员函数
          s.Base::func();
    }
    int main()
    {
          test01();
          test02();
          system("pause");
          return 0;
    }
    


    六、继承同名静态成员处理方式

    问题:继承中同名的静态成员在子类对象上如何进行访问 ?
    静态成员和非静态成员出现同名,处理方式一致

    • 访问子类同名,直接访问
    • 访问父类同名,加作用域
    • 如果子类中出现和父类同名静态成员函数,子类的静态同名成员,会隐藏掉父类中所有同名静态成员函数,如果想访问被隐藏的同名静态成员函数,加上作用域即可
    #include <iostream>
    using namespace std;
    
    class Base 
    {
    public:
          static int m_a;
          static void func()
          {
                cout << "Base - static func()调用" << endl;
          }
    };
    int Base::m_a = 100;
    class Son : public Base
    {
    public:
          static int m_a;
          static void func()
          {
                cout << "Son - static func()调用" << endl;
          }
    };
    int Son::m_a = 200;
    
    // 同名的静态成员属性
    void test01()
    {
          // 1. 通过对象访问
          Son s;
          cout << "Son 下 m_a = " << s.m_a <<endl;
          cout << "Base 下 m_a = " << s.Base::m_a <<endl;
          
          // 2. 通过类名访问
          cout << "类名访问" << Son :: m_a << endl;
          cout << "通过子类对象用类名访问" << Son :: Base:: m_a << endl;  //第一个 ::代表通过类名方式访问,第二个 ::代表访问父类作用域下
    }
    
    // 同名静态成员函数
    void test02()
    {
          // 1. 通过对象访问
          Son s;
          s.func(); // 直接调用子类中的同名成员函数
          s.Base::func();
    
          // 2. 通过类名访问
          Son::func();
          Son :: Base::func();
    }
    int main()
    {
          test01();
          test02();
          system("pause");
          return 0;
    }
    

    静态成员属性:编译阶段分配内存,所有对象共享同一份数据,类内声明,类外初始化



  • 相关阅读:
    【CF536D】Tavas in Kansas(博弈+动态规划)
    【CF643F】Bears and Juice(信息与可区分情况数)
    【AT3981】[ARC093D] Dark Horse(容斥+状压DP)
    【CF708E】Student's Camp(动态规划)
    【洛谷6775】[NOI2020] 制作菜品(思维好题)
    【洛谷2282】[HNOI2003] 历史年份(线段树优化DP)
    【洛谷5068】[Ynoi2015] 我回来了(线段树)
    【洛谷4117】[Ynoi2018] 五彩斑斓的世界(第二分块)
    【洛谷3745】[六省联考2017] 期末考试(水题)
    【AtCoder】AtCoder Grand Contest 050 解题报告(A~D)
  • 原文地址:https://www.cnblogs.com/BY1314/p/12996809.html
Copyright © 2011-2022 走看看