C++繼承之同名隱藏
阿新 • • 發佈:2018-12-27
同名隱藏
定義:基類和派生類中具有相同名稱的成員(成員變數/成員函式), 派生類會自動遮蔽基類中此成員,而優先訪問派生類自己的成員,基類同名成員就被隱藏了。同名隱藏分為兩類:類成員隱藏和類成員函式隱藏。
- 類成員隱藏:派生類和基類中有同名成員變數,派生類成員將遮蔽基類對同名成員的直接訪問,這種情況叫隱藏,也叫重定義。
//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構成隱藏,由此我們得出結論:成員函式滿足函式名相同就構成隱藏