同名隐藏
定义:基类和派生类中具有相同名称的成员(成员变量/成员函数), 派生类会自动屏蔽基类中此成员,而优先访问派生类自己的成员,基类同名成员就被隐藏了。同名隐藏分为两类:类成员隐藏和类成员函数隐藏。
- 类成员隐藏:派生类和基类中有同名成员变量,派生类成员将屏蔽基类对同名成员的直接访问,这种情况叫隐藏,也叫重定义。
//A中的_a与B中的_a构成隐藏关系
class A
{
public:
void fun()
{
cout << "func()" << endl;
}
public:
int _a = 5;
};
class B : public A
{
public:
void fun(int i)
{
A::fun();
cout << "func(int i)->" << i << endl;
}
public:
int _a = 10;
};
void Test()
{
B b;
cout << b._a << endl;
};
运行程序:
由这个例子我们发现:派生类成员B在访问与基类成员A同名的成员_a时,直接访问了自己的类成员_a,而屏蔽了基类对同名成员的直接访问,印证上述定义。
注意:在实际中的继承体系里面最好不要定义同名的成员,否则非常容易混淆。
- 类成员函数隐藏:只要函数名相同就构成隐藏。(在派生类成员函数中,可以使用 基类::基类成员 显示访问)
按照定义,派生类与基类存在相同函数名的成员函数,那么这个函数会不会发生函数重载呢?
答案是不会,因为函数重载需要在同一作用域内,而继承中派生类和基类有各自独立的作用域。
class A
{
public:
void fun()
{
cout << "func()" << endl;
}
public:
int _a = 5;
};
class B : public A
{
public:
void fun(int i)
{
cout << "func(int i)->" << i << endl;
}
public:
int _a = 10;
};
void Test()
{
B b;
b.fun(10);
};
运行程序:
B中的fun和A中的fun构成隐藏,由此我们得出结论:成员函数满足函数名相同就构成隐藏