在繼承體系中我們的編寫派生類一般可分四個步驟:
1>吸收基類成員(除建構函式和析構函式外全部接收)
2>改造基類成員(宣告乙個和某基類成員的新成員,派生類中的新成員就遮蔽了基類同名成員稱為同名隱藏)
3>發展新成員(派生類新成員必須與基類成員不同名,它的加入保證派生類在功能上有所發展)
4>重寫建構函式和析構函式
同名隱藏:只要子類新成員的函式名與父類函式名相同,子類寫的函式將會隱藏所有父類和子類同名的函式,只要名字相同就可以,不管引數列表。下面我們看乙個例子。
上面的例子你看到我們子類有和父類的同名函式後,我們子類訪問這個同名的函式,調動的是子類裡的方法。你肯定會有疑問,我們可以用子類物件調動父類的引數列表不同的函式嗎?繼續往下看吧。
看到了麼,只要我們父類函式名和子類新成員的相同就會被隱藏。
那麼我們就沒有辦法訪問父類的同名方法麼,當然可以發明c++的人是偉大的。我們只要加個父類物件的作用域就可以了。
當然我們還有其他不用父類物件作用域驅動的方法訪問父類中的同名函式。這就該我們的賦值相容規則出場。何為賦值相容規則:
1>派生類的物件可以賦值給基類物件,不會產生臨時物件或者強制型別轉換,因為子類隱藏包含乙個父類物件,結構,大小一致。反過來不行,因為子類有新新增的成員,父類無值可賦給它。
2>可以將乙個派生類物件的位址賦給父類指標變數,但是只能通過這個指標訪問派生類中由基類繼承來的隱藏函式,不能訪問派生類中的新成員。當然也不能反過來賦值。
我們是不能通過父類指標去訪問子類函式的,不管這個函式是不是和父類同名都不能調動。
3>派生類物件可以初始化基類的引用。同樣這個引用物件也只能訪問派生類中由基類繼承來的隱藏函式,不能訪問派生類中的新成員。當然也不能反過來引用。
引用與指標同理這裡不再贅述。
這樣看來我們父類的指標或引用只能訪問父類的成員,是不是看上去很可惜。我一再強調我們的c++發明者是偉大的。要想訪問子類的函式我們就需要加上virtual來實現我們的多型了。
欲知後事如何且聽下次分解。
如有錯誤之處還請指教。
型別相容規則與同名隱藏規則
型別相容規則 通過公有繼承,派生類得到了基類中除建構函式 析構函式之外的所有成員。這樣,公有派生類實際就具備了基類的所有功能,凡是基類能解決的問題,公有派生類都可以解決。乙個公有派生類的物件在使用上可以被當作基類的物件 通過基類物件名 指標只能使用從基類繼承的成員 include using nam...
四 同名隱藏,繼承的特性 賦值相容規則
目錄 一.子類中的函式同名隱藏 二.繼承的特性 賦值相容規則 1.同名隱藏的概念 設在某一繼承關係中,子類中有乙個和父類中同名的函式 show 那麼子類在呼叫show 方法時,系統將呼叫子類的show 方法,而不會去呼叫父類的show 方法,這種現象叫做同名隱藏。切記 這裡的show 方法不是我後面...
《C 同名函式》同名隱藏與賦值
includeusing namespace std class base base public void show 派生與基類 在任何需要基類物件的地方都可以死用公有派生類的物件來代替,這條規則稱 賦值相容規則。它包括以下情況 1 派生類的物件可以賦值給基類的物件,這時把派生類物件中,從對應基類...