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!

推薦閱讀: