C 子類物件隱藏了父類的同名成員函式(隱藏篇)

2021-09-30 14:35:53 字數 1155 閱讀 3416

#include

#include

#include

using namespace std;

/*** 定義人類: person

* 資料成員: m_strname

* 成員函式: attack()

*/class person

person(const person& p)

string m_strname;

void attack()

};/**

* 定義士兵類: soldier

* 士兵類公有繼承人類

* 資料成員: m_strname

* 成員函式: attack()

*/class soldier:public person

string m_strname;

void attack()

};int main(void)

輸出結果:

person()

soldier()

person(const person& p)

tomato

jimfire!!!

attack

通過上面的例子,對於基類和子類之間的特性可以做如下的總結:
(1)當子類中含有和基類同名的成員變數時,再用子類的物件呼叫該同名成員變數時,將只會呼叫到子類自身定義的成員變數,而不會呼叫到基類的同名成員變數,這種現象就叫做隱藏,子類把基類的同名成員變數隱藏了,正確呼叫方式如上面例子中橘色字型部分:soldier.person::m_strname;
(2)當子類中含有和基類同名的成員函式時,再用子類的物件呼叫該同名成員函式時,將只會呼叫到子類自身定義的成員函式,而不會呼叫到基類定義的同名的成員函式,這也是因為子類把基類的同名成員函式隱藏了;正確呼叫方法應該是如上面例子中橘色字型部分:soldier.person::attack();

這裡要強調的是何為同名成員函式,即不管引數是否相同、返回值是否相同,只要函式名稱相同,就是同名成員函式,如果子類和基類定義了這樣的函式,子類就會把基類的相應函式隱藏掉。在上面的例子中加入我們在基類person的attack()函式裡面新增引數int x,這個時候用soldier.attack(5)這種方式試圖呼叫基類的attack()仍然會報錯,是呼叫不到的。

C 子類和父類同名成員變數或函式

在c 中子類和父類同名成員時候c 版本不同處理的方式也不同。下面是我使用visual c 2015 update 3的測試結果 測試 如下 include using namespace std class base virtual void print base class public base...

C 繼承時子類父類同名成員變數的問題

如下 c c code include iostream.h class base intprint base class public base print main 輸出結果是0,1。而不是1,1。為什麼不同呢?解釋 因為在繼承的時候,允許子類存在與父類同名的成員變數,但是並不覆蓋父類的成員變數...

C 子類父類成員函式的覆蓋和隱藏例項詳解

函式的覆蓋 覆蓋發生的條件 1 基類必須是虛函式 使用virtual 關鍵字來進行宣告 2 發生覆蓋的兩個函式分別位於派生類和基類 3 函式名和引數列表必須完全相同 函式的隱藏 隱藏發生的條件 1 子類和父類的函式名相同,引數列表可以不一樣 看完下面的例子就明白了 include iostream ...