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

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



原文地址:https://www.cnblogs.com/BY1314/p/12996809.html