使用“override”声明的成员函数不能重写基类成员_C++日志(三十五)虚基类与其子类的构造函数...
第三十四篇日志中提到,子類對象調用父類同名的函數時需要使用作用域標識符進行限定,這是在任何繼承情況下都可以使用的普適方法。
問題引入:
考慮一種特殊的情況:子類全部或部分的基類(稱為中間基類)同是繼承自另一個基類(稱為最底層基類),此時子類含有最底層基類成員的多個副本。如果子類對象想要訪問這些副本,必須通過作用域標識符指出其訪問的副本來自哪個路徑:
比如上圖中子類Z繼承自類Y1和類Y2(中間基類),同時類Y1和類Y2又均繼承自X類;Y1和Y2都存在類X的成員,也就是存在兩個副本。
解決方法:
如果不希望中間基類含有最底層基類X的兩個副本,可以將被繼承的類聲明為虛基類,即在中間類聲明時將最底層基類聲明為虛基類。虛基類聲明的語法如下:
class需要注意的是,virtual并不出現在子類聲明中,而是針對中間基類的(即Y1和Y2)。
進行上述聲明以后, 從不同路徑繼承得到的數據和函數成員在子類中只有一個副本,子類Z的對象就可以不使用作用域標識符對最底層基類X的成員進行訪問了。
例子:
下面的例子中Y1和Y2中使用virtual將X聲明為虛基類:
class聲明為虛基類以后,子類就僅含有一個最底層基類的成員副本,即Z只有一個X中的fun()函數和value數據的副本。此時,Z的對象就可以直接訪問fun()和value了,如下:
Z補充:
當最底層基類X需要帶參數的構造函數時,中間基類Y1和Y2的構造函數需要調用X的構造函數。同時,子類Z也需要對X、Y1和Y2的構造函數進行調用。代碼如下:
class那么,X的構造函數會被調用三次嗎(Z、Y1和Y2各調用X構造函數一次)?
答案是否定的,C++中將當前對象所屬的類稱為最遠子類,并規定只有最遠子類才會調用虛基類的構造函數,不會出現虛基類的構造函數被重復調用的情況。
總結
以上是生活随笔為你收集整理的使用“override”声明的成员函数不能重写基类成员_C++日志(三十五)虚基类与其子类的构造函数...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 专项附加扣除怎么算
- 下一篇: rcep是什么意思 区域全面经济伙伴关系