06-5 继承同名成员处理方式
思考:当子类和父类中出现了同名的成员,如何通过子类对象访问父类的同名成员,子类呢?
#include <iostream>
#include <string>
using namespace std;
class A
{
public:
string m = "这是类 A 的成员属性。";
void f()
{
cout << "这是类 A 的成员函数。" << endl;
}
};
class B :public A
{
public:
string m = "这是类 B 的成员属性。";
void f()
{
cout << "这是类 B 的成员函数。" << endl;
}
};
int main()
{
class B b;
cout << b.m << endl;
cout << b.A::m << endl;
b.f();
b.A::f();
return 0;
}
运行结果:(环境:Windows11(arm/Apple M VM)/Visual Studio 2022/Debug/arm64)
这是类 B 的成员属性。
这是类 A 的成员属性。
这是类 B 的成员函数。
这是类 A 的成员函数。
我们来分析一下:
在这里,我们创建了两个类,一个类是类A
,另外一个是类B
。其中,类B
使用公共继承方式(public
)继承自类 A
。
在类A
和类B
中,分别都有一个一个成员属性m
和成员函数f
。
之后我们使用cout
命令打印b.m
,发现打印的是类B
的成员属性。但如果在对象后加上作用域:b.A::m
,就可以成功访问到类A
(对于类B
来说,是其的父类)的成员属性了。
之后我们再次创建两个类的同名成员函数,发现直接调用b.f();
,只能调用到在类B
中的f
函数,但如果在对象后加上作用域再调用:b.A::f();
,就可以成功访问到类A
(对于类B
来说,是其的父类)的成员函数了。
所以可以得出:如果子类中出现了和父类同名的成员,子类同名成员会默认隐藏掉父类的同名成员。如果需要访问父类的被隐藏的同名成员,需要加上作用域。
- 总结:
- 子类对象可以直接访问子类同名成员
- 子类对象加上作用域可以访问到父类中的同名成员(包括同名成员属性和成员函数)。
:-)