虛基類
在前面學過的繼承過程中,不知道大家有沒有想到這種情況:在多繼承關係中,如果一個派生類別的從兩個父類別那裡繼承過來,並且這兩個父類又恰恰是從一個基底類別那裡繼承而來。那這樣就麻煩了,因為你可能繼承了兩份一樣的成員!
這就出現了所謂二義性問題,下面我們展開學習吧!
先給大家舉一個能說明這種多繼承的例子吧!我想來想去,想了這麼一個例子:以前有一個大戶人家,起初就兩口子,男主人掌權,保管著大門鑰匙,後來他們有兩個兒子,若干年後長大成人,男主人也老了,就把鑰匙又配了兩把,分別交給他的兩個兒子,交由他們主持家業,又過去好多年,兩個兒子也都成了家,又分別有一男一女,也就是家裡的孫子孫女,傳宗接代。所謂人丁興旺,後來他們也長大成人,又到了交接鑰匙的時候,在古代鑰匙當然要傳給男孩,所以這個時候鑰匙當然要給孫子,此時孫子的爹和他的叔伯(也就是最初主人倆的兒子)都要配一個鑰匙給這個孫子,他手上就有兩把。小孫子看著手裡兩把鑰匙,說:“一把就夠!兩把…這不浪費嘛!”
看完這個故事,大家就好理解多繼承了,故事中最初的男主人,也就是爺爺,就是基類,他的兩個孩子,是兩個派生類,然後其中一個人的孩子,就是那個小孫子,就是最後的派生類,由於他繼承自兩個派生類。而這兩個衍生類別都有一個共同的成員(鑰匙,因為都繼承同一個基底類別-爺爺)。最後的小孫子的衍生類別有兩個重複的成員(鑰匙),就是二義性的根源所在!
下面,我們依照這個例子,具體寫成程式碼,大家可以參考:
/**************************************//Des:C++教學demo//Author: Huang//Copyright:www.dotcpp.com//Date:2017/12/18******************************* *******/#include<iostream>usingnamespacestd;classGrandfather{public:intkey;public:};classFather1:publicGrandfather{};classFather2:publicGrandfather{};classGrandson:publicFather1,publicFather2{};intmain(){GrandsonA ;//A.key=9;return0;}
程式碼就是剛才故事的一個表現,為了方便形容,定義的四個類別都很空,重點看繼承關係即可。即Grandson類別繼承兩個father類,會有兩個key成員,這個時候如果試圖使用這個key,注意已經宣告為public類型,在主函數中試圖賦值時候,會有「不唯一、模稜兩可」的錯誤提示,也就是所謂的二義性問題發生,大家可以好好體會。
那麼如何規避這個問題呢?此時就要使用虛基類!所謂虛基類別就是在繼承的時候在繼承類型public之前用virtual修飾一下,比如還是這個例子,只需要父親類在繼承爺爺類的時候多加一個virtual,那麼這個時候,派生類和基類就只維護一份一個基底類別物件。避免多次拷貝,出現歧義。
定義方法即在兩個父親類別的派生時增加virtual的聲明:
classFather1:virtualpublicGrandfatherclassFather2:virtualpublicGrandfather
其餘不變,大家可以自行上機測試,理解二義性的產生及虛基類的用法。