问题场景:当子类与父类出现同名的成员,如何通过子类对象访问到子类或者父类中同名的数据呢?
- 访问子类同名成员:直接访问即可。
- 访问父类同名成员:需要加作用域。
同名成员:
- 成员属性:加父类作用域
- 成员函数:加父类作用域;重载的同名函数,也必须加作用域。
#include<iostream>
using namespace std;
class Base
{
public:
Base()
{
m_A = 100;
}
void func()
{
cout << "Base - func()调用" << endl;
}
void func(int a)
{
cout << "Base - func(int a)调用" << endl;
}
int m_A;
};
class Son:public Base
{
public:
Son()
{
m_A = 1000;
}
void func()
{
cout << "Son - func()调用" << endl;
}
//void func(int a)
//{
// cout << "Son - func(int a)调用" << endl;
//}
int m_A;
};
void test01()
{
Son s;
cout << "Son 下 m_A = " << s.m_A << endl;
// 如果通过子类对象访问父类中同名成员,需要加
cout << "Base下 m_A = " << s.Base::m_A << endl;
s.func(); // 不定义子类的func,会直接调用父类的func函数。
// 如果定义了子类中的func函数,那么会优先调用最新定义的子类func函数。
// 如何调用父类中的同名函数呢?加父类作用域。
s.Base::func();
// 重载情况:父类重载一个同名函数。子类无法访问。
//s.func(10); // 原因:如果子类中出现于父类同名的成员函数,子类的同名成员函数会隐藏掉分类中所有同名成员函数(包括所有重载版本)。所以子类无法访问重载函数。
// 子类中有一个func同名函数了,那么父类中所有同名函数都被隐藏了,只能通过加作用域的方式访问。
s.Base::func(100); // 可以访问。
}
int main()
{
test01();
system("pause");
return 0;
}
如果子类对象想要访问到父类中的同名成员,需要加上父类作用域。
总结:
- 子类对象可以直接访问子类中的同名成员。
- 子类对象加上父类作用域可以访问到父类中的同名成员。
- 当子类与父类拥有同名的成员函数,子类会隐藏父类中同名成员函数,加父类作用域(Son.Base::.func())可以访问到父类中同名函数。