溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

C++私有繼承是什么

發(fā)布時(shí)間:2022-02-07 10:22:23 來(lái)源:億速云 閱讀:127 作者:iii 欄目:開(kāi)發(fā)技術(shù)

本篇內(nèi)容介紹了“C++私有繼承是什么”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

1.私有繼承

通過(guò)私有繼承,我們可以實(shí)現(xiàn)一種has-a的關(guān)系。

但前文當(dāng)中我們也曾說(shuō)過(guò),通過(guò)包含對(duì)象我們一樣可以實(shí)現(xiàn)has-a的關(guān)系,那么在我們進(jìn)行編碼的時(shí)候,究竟應(yīng)該使用哪一種呢?

根據(jù)C++ Primer中的闡述,大多數(shù)程序員會(huì)更傾向于使用包含,因?yàn)檫@更加容易理解。類(lèi)聲明當(dāng)中包含對(duì)象,我們可以在成員函數(shù)當(dāng)中直接使用,這顯然更加直觀,而使用繼承的方式則非常地抽象。

其次,多個(gè)基類(lèi)繼承的時(shí)候,也可能會(huì)引起一些問(wèn)題。比如包含同名方法的獨(dú)立基類(lèi),或者是擁有共同祖先的獨(dú)立基類(lèi)等等。另外,使用私有繼承只能使用一個(gè)父類(lèi)對(duì)象,而通過(guò)包含的方式可以使用任意多個(gè)對(duì)象。

但私有繼承的方式也有一些特有的優(yōu)點(diǎn),比如說(shuō)可以在派生類(lèi)當(dāng)中使用基類(lèi)的保護(hù)成員,但如果是包含的話,就沒(méi)辦法使用這些保護(hù)成員或者方法了。另外,派生類(lèi)可以重新定義虛函數(shù),而包含類(lèi)的方式不行。

只能說(shuō)通常我們要實(shí)現(xiàn)has-a的包含關(guān)系,應(yīng)該使用包含類(lèi)對(duì)象的方式,但在一些特殊場(chǎng)景當(dāng)中,也許使用繼承是更好的選擇。

2.保護(hù)繼承

保護(hù)繼承是私有繼承的變體,保護(hù)繼承在列出基類(lèi)時(shí)使用關(guān)鍵字protected:

class Student : protected std::string, protected std::valarray<double> {
    ...
};

使用保護(hù)繼承時(shí),基類(lèi)的公有成員和保護(hù)成員都會(huì)成為派生類(lèi)的保護(hù)成員。

和私有繼承一樣,基類(lèi)的接口在派生類(lèi)當(dāng)中也是可用的,但在繼承層次結(jié)構(gòu)之外是不可用的。當(dāng)我們從派生類(lèi)繼續(xù)派生出第三代類(lèi)的時(shí)候,私有繼承和保護(hù)繼承的區(qū)別就出來(lái)了。使用私有繼承時(shí),第三代類(lèi)不能使用基類(lèi)的接口,因?yàn)榛?lèi)的公有方法在派生類(lèi)當(dāng)中變成了私有方法。而使用保護(hù)繼承的話,基類(lèi)的公有方法在派生類(lèi)變成受保護(hù)的,所以第三代派生類(lèi)依然可以使用。

3.使用using重新定義訪問(wèn)權(quán)限

使用保護(hù)派生或者是私有派生時(shí),基類(lèi)的公有成員將會(huì)變成保護(hù)成員或者是私有成員。

假設(shè)要想讓基類(lèi)的方法在派生類(lèi)外部可用,方法之一是單獨(dú)開(kāi)發(fā)一個(gè)派生類(lèi)方法,在這個(gè)方法當(dāng)中調(diào)用基類(lèi)的方法。比如假設(shè)希望Student類(lèi)能夠使用valarray類(lèi)的sum方法,一個(gè)做法是在Student中聲明一個(gè)sum方法,然后在這個(gè)方法當(dāng)中調(diào)用valarray類(lèi)的sum方法:

double Student::sum() const {
    return std::valarray<double>::sum();
}

另外一種方法是將調(diào)用函數(shù)包裝在另外一個(gè)函數(shù)的調(diào)用中,即使用using聲明,來(lái)指出派生類(lèi)可以使用特定的基類(lèi)成員。

比如假設(shè)我們希望Student類(lèi)能夠使用valarray的sum和max方法,我們可以在student.h的公有部分加上using聲明:

class Student : private std::string, private std::valarray<double> {
   public:
     using std::valarray<double>::min;
     using std::valarray<double>::max;
    ...
};

這樣一來(lái),valarray::minvalarray::max就變得可用了,就好像是Student的公有方法一樣:

cout << ada[i].max() << endl;

這里要注意,using聲明只使用方法名,沒(méi)有圓括號(hào)、函數(shù)特征表和返回類(lèi)型。

“C++私有繼承是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI