1. 程式人生 > >C++繼承之同名隱藏

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構成隱藏,由此我們得出結論:成員函式滿足函式名相同就構成隱藏