日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

使用“override”声明的成员函数不能重写基类成员_C++日志(三十五)虚基类与其子类的构造函数...

發布時間:2024/10/12 c/c++ 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用“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++日志(三十五)虚基类与其子类的构造函数...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。