问题:当子类与父类出现同名的成员,如何通过子类对象,访问到子类或父类中同名的数据呢?
- 访问子类同名成员 直接访问即可
- 访问父类同名成员 需要加作用域
同名成员变量
添加作用域class Father {public:int a = 10;};class Son :public Father {public:int a = 20;};void example() {Son s1;cout << "Son s1.a = " << s1.a << endl;cout << "Father s1.a = " << s1.Father::a << endl;}
同名成员函数
也是增加作用域#include <iostream>#include <string>using namespace std;class Father {public:void func() {cout << "Father func()" << endl;}};class Son :public Father {public:void func() {cout << "Son func()" << endl;}};void example() {Son s1;s1.func();s1.Father::func();}int main() {example();return 0;}
那么可以总结出三条原则:
- 子类对象可以直接访问到子类中同名成员
- 子类对象加作用域可以访问到父类同名成员
- 当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加作用域可以访问到父类中同名函数
同名的静态变量
问题:继承中同名的静态成员在子类对象上如何进行访问?
静态成员和非静态成员出现同名,处理方式一致
- 访问子类同名成员 直接访问即可
- 访问父类同名成员 需要加作用域
示例:
class Base {public:static void func(){cout << "Base - static void func()" << endl;}static void func(int a){cout << "Base - static void func(int a)" << endl;}static int m_A;};int Base::m_A = 100;class Son : public Base {public:static void func(){cout << "Son - static void func()" << endl;}static int m_A;};int Son::m_A = 200;//同名成员属性void test01(){//通过对象访问cout << "通过对象访问: " << endl;Son s;cout << "Son 下 m_A = " << s.m_A << endl;cout << "Base 下 m_A = " << s.Base::m_A << endl;//通过类名访问cout << "通过类名访问: " << endl;cout << "Son 下 m_A = " << Son::m_A << endl;cout << "Base 下 m_A = " << Son::Base::m_A << endl;}//同名成员函数void test02(){//通过对象访问cout << "通过对象访问: " << endl;Son s;s.func();s.Base::func();cout << "通过类名访问: " << endl;Son::func();Son::Base::func();//出现同名,子类会隐藏掉父类中所有同名成员函数,需要加作作用域访问Son::Base::func(100);}int main() {//test01();test02();system("pause");return 0;}
总结:同名静态成员处理方式和非静态处理方式一样,只不过有两种访问的方式(通过对象 和 通过类名)
::作用域访问符号的意义并不一样
