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;
    }
    

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



  • 相关阅读:
    Nginx性能测试
    Centos 7.0设置/etc/rc.local无效问题解决
    Centos 7.0系统服务管理
    Centos 7.0设置静态IP
    importError:cannot import name imsave/imread等模块
    一位父亲写给儿子的信:今天你努力一点,比将来低头求人强100倍
    清华大学计算机学科推荐学术会议和期刊列表---人工智能与模式识别
    在使用python语言的open函数时,提示错误OSError: [Errno 22] Invalid argument: ‘文件路径’
    论文阅读笔记---HetConv
    typeerror: __init__() missing 2 required positional arguments: 'inputs' and 'outputs'
  • 原文地址:https://www.cnblogs.com/BY1314/p/12996809.html
Copyright © 2011-2022 走看看