C++私有繼承(二)
文章轉自微信 公眾號:Coder梁(ID:Coder_LT)
我們繼續上一篇文章來看私有繼承。
1.訪問基類方法
我們知道,在私有繼承時,基類的公有對象以及保護對象會變成派生類的私有對象。我們可以在派生類方法當中使用它,但無法通過派生類對象直接調用,但無法訪問基類的私有方法和對象。
這個概念我們很好理解,但具體到實現上,我們如何在派生類的方法當中調用基類的公有或者保護方法呢?
比如,在之前的類聲明當中我們聲明瞭一個Average
方法,用來計算學生考試成績的平均分。由於Student
類是繼承瞭valarray
類,而非包含一個valarray
的實例,那麼我們如何在Average
方法的實現當中調用valarray
的公有方法呢?
答案是通過解析運算符和類名調用
double Student::Average() const { if (ArrayDb::size() > 0) { return ArrayDb::sum() / ArrayDb::size(); } return 0; }
2.訪問基類對象
現在我們知道瞭使用解析運算符可以訪問基類的方法,但問題又來瞭,如果我們要訪問的不再是基類的方法而是基類對象本身,那麼我們應該怎麼辦呢?
比如同樣例子當中我們有一個Name
方法,需要返回學生的姓名。由於Student
類隻是繼承瞭string
類並沒有自己的string實例,因此我們需要返回基類對象本身。
同樣,我們怎麼操作呢?
答案是使用強制轉換。
const string& Student::Name() const { return (const string&) *this; }
因為Student
類是從string類中派生而來,所以我們是可以將Student
對象強制轉換成string
對象的。
3.訪問基類的友元
方法和對象都好辦,但友元怎麼辦呢?因為友元函數並不屬於類,所以無法通過類名或者解析運算符搞定。針對這種情況,我們隻能取巧,通過顯式地對派生類進行類型轉換實現。
例如:
ostream & operator<<(ostream& os, const Student& stu) { os << "Scores for " << (const string&) stu << ":\n"; }
在這個方法當中,我們顯式地將stu實例轉變成瞭基類string
的類型,這樣就可以調用基類string的友元瞭。
引用不會自動發生轉換,是因為在私有繼承當中,在不進行顯式類型轉換的情況下,不能將派生類的引用或指針賦給基類的引用或指針。
那麼問題來瞭,如果我們使用的是公有繼承,那麼是不是就可以瞭呢?
答案是依然不行。
原因也簡單,首先在不使用類型轉換的情況下,os << stu和自身的友元函數類型匹配, 將會發生遞歸。其次由於C++支持多繼承,所以編譯器將會無法確定轉換成哪個基類的類型。因此還是需要我們手動進行強制類型轉換。
到此這篇關於Easy私有繼承的文章就介紹到這瞭,更多相關Easy私有繼承內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!