您好,登錄后才能下訂單哦!
本篇內容介紹了“C++私有繼承方法是什么”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
我們知道,在私有繼承時,基類的公有對象以及保護對象會變成派生類的私有對象。我們可以在派生類方法當中使用它,但無法通過派生類對象直接調用,但無法訪問基類的私有方法和對象。
這個概念我們很好理解,但具體到實現上,我們如何在派生類的方法當中調用基類的公有或者保護方法呢?
比如,在之前的類聲明當中我們聲明了一個Average
方法,用來計算學生考試成績的平均分。由于Student
類是繼承了valarray
類,而非包含一個valarray
的實例,那么我們如何在Average
方法的實現當中調用valarray
的公有方法呢?
答案是通過解析運算符和類名調用
double Student::Average() const { if (ArrayDb::size() > 0) { return ArrayDb::sum() / ArrayDb::size(); } return 0; }
現在我們知道了使用解析運算符可以訪問基類的方法,但問題又來了,如果我們要訪問的不再是基類的方法而是基類對象本身,那么我們應該怎么辦呢?
比如同樣例子當中我們有一個Name
方法,需要返回學生的姓名。由于Student
類只是繼承了string
類并沒有自己的string實例,因此我們需要返回基類對象本身。
同樣,我們怎么操作呢?
答案是使用強制轉換。
const string& Student::Name() const { return (const string&) *this; }
因為Student
類是從string類中派生而來,所以我們是可以將Student
對象強制轉換成string
對象的。
方法和對象都好辦,但友元怎么辦呢?因為友元函數并不屬于類,所以無法通過類名或者解析運算符搞定。針對這種情況,我們只能取巧,通過顯式地對派生類進行類型轉換實現。
例如:
ostream & operator<<(ostream& os, const Student& stu) { os << "Scores for " << (const string&) stu << ":\n"; }
在這個方法當中,我們顯式地將stu實例轉變成了基類string
的類型,這樣就可以調用基類string的友元了。
引用不會自動發生轉換,是因為在私有繼承當中,在不進行顯式類型轉換的情況下,不能將派生類的引用或指針賦給基類的引用或指針。
那么問題來了,如果我們使用的是公有繼承,那么是不是就可以了呢?
答案是依然不行。
原因也簡單,首先在不使用類型轉換的情況下,os << stu和自身的友元函數類型匹配, 將會發生遞歸。其次由于C++支持多繼承,所以編譯器將會無法確定轉換成哪個基類的類型。因此還是需要我們手動進行強制類型轉換。
“C++私有繼承方法是什么”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。