虛基類
成人app在前面學過的繼承過程中,不知道大家有沒有想到這種情況:在多繼承關系中,如果一個派生類的從兩個父類那里繼承過來,并且這兩個父類又恰恰是從一個基類那里繼承而來。那這樣就麻煩了,因為你可能繼承了兩份一樣的成員!
成人app這就出現了所謂二義性問題,下面我們展開學習:
先給大家舉一個能說明這種多繼承的例子吧,筆者我想來想去,想了這么一個例子:以前呢有一個大戶人家,起初呢就兩口子,男主人掌權,保管著大門鑰匙,后來他們有兩個兒子,若干年后長大成人,男主人也老了,就把鑰匙又配了兩把,分別交給他的兩個兒子,交由他們主持家業,又過去好多年,兩個兒子也都成了家,又分別有一男一女,也就是家里的孫子孫女,傳宗接代。所謂人丁興旺吖,后來他們也長大成人,又到了交接鑰匙的時候,古代當然鑰匙要傳給男孩啦,那么這個時候,當然給孫子啦,這個時候呢孫子的爹和他的叔伯(也就是最初主人的倆兒子)都要配一個鑰匙給這個孫子,他手上就有了兩把。
小孫子看著手里兩把鑰匙,說:“一把就夠!兩把…這不浪費嘛!”
看完這個故事,大家就好理解多繼承了,故事中最初的男主人,也就是爺爺,就是基類,他的兩個孩子,是兩個派生類,然后其中一個人的孩子,就是那個小孫子,就是最后的派生類,由于他繼承自兩個派生類。且這兩個派生類都有一個共同的成員(鑰匙,因為都繼承同一個基類--爺爺)。最后的小孫子的派生類有兩個重復的成員(鑰匙),就是二義性的根源所在!
下面,我們按照這個例子,具體成代碼,大家可以參考:
/************************************** //Des:C++教程demo //Author:Huang //Copyright:hnsaiyang.com //Date:2017/12/18 **************************************/ #include <iostream> using namespace std; class Grandfather { public: int key; public: }; class Father1:public Grandfather { }; class Father2:public Grandfather { }; class Grandson:public Father1,public Father2 { }; int main() { Grandson A; //A.key=9; return 0; }
成人app代碼就是剛才故事的一個表現,為了方便形容,定義的四個類都很空,重點看繼承關系即可。即Grandson類繼承兩個father類,會有兩個key成員,這個時候如果試圖使用這個key,注意已經聲明為public類型,在主函數中試圖賦值時候,會有“不唯一、模棱兩可”的錯誤提示,即所謂的二義性問題發生。大家可以好好體會。
那么如何規避這個問題呢?即使用虛基類!
所謂虛基類就是在繼承的時候在繼承類型public之前用virtual修飾一下 。比如還是這個例子,只需要父親類在繼承爺爺類的時候多加一個virtual,那么這個時候,派生類和基類就只維護一份一個基類對象。避免多次拷貝,出現歧義。
成人app定義方法即在兩個父親類的派生時增加virtual的聲明:
class Father1:virtual成人app public Grandfather
class Father2:virtual public Grandfather
成人app其余不變,大家可以自行上機測試,理解二義性的產生及虛基類的用法。
本文固定URL:http://hnsaiyang.com/course/78