C++继承之同名隐藏

同名隐藏

定义:基类和派生类中具有相同名称的成员(成员变量/成员函数), 派生类会自动屏蔽基类中此成员,而优先访问派生类自己的成员,基类同名成员就被隐藏了。同名隐藏分为两类:类成员隐藏类成员函数隐藏。

  • 类成员隐藏:派生类和基类中有同名成员变量,派生类成员将屏蔽基类对同名成员的直接访问,这种情况叫隐藏,也叫重定义。
//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构成隐藏,由此我们得出结论:成员函数满足函数名相同就构成隐藏

猜你喜欢

转载自blog.csdn.net/ENSHADOWER/article/details/85227606