文章内容发布于 635 天前;最后修改于 635 日前。其中的信息可能发生变化或产生更改,敬请留意。
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来说,是其的父类)的成员函数了。
所以可以得出:如果子类中出现了和父类同名的成员,子类同名成员会默认隐藏掉父类的同名成员。如果需要访问父类的被隐藏的同名成员,需要加上作用域。
- 总结:
- 子类对象可以直接访问子类同名成员
- 子类对象加上作用域可以访问到父类中的同名成员(包括同名成员属性和成员函数)。