溫馨提示×

溫馨提示×

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

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

如何解析C++類繼承關(guān)系問題

發(fā)布時(shí)間:2021-10-27 17:55:13 來源:億速云 閱讀:142 作者:柒染 欄目:編程語言

今天就跟大家聊聊有關(guān)如何解析C++類繼承關(guān)系問題,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

對***次接觸到C++類繼承的用戶和學(xué)者來說,但是首先要對C++類繼承的性質(zhì)進(jìn)行充分了解,那么就先說一下什么是C++類,所謂C++類:類是定義同一類所有對象的變量和方法的藍(lán)圖或原型。

1. public
從語義角度上來說,public繼承是一種接口C++類繼承,根據(jù)面向?qū)ο笾械年P(guān)系而言就是,子類可以代替父類完成父類接口所聲明的行為,也就是必須符合“Liskov替換(LSP)”,此時(shí)子類可以自動(dòng)轉(zhuǎn)換成為父類的接口,完成接口轉(zhuǎn)換。從語法角度上來說,public繼承會(huì)保留父類中成員(包括函數(shù)和變量等)的可見性不變,也就是說,如果父類中的某個(gè)函數(shù)是public的,那么在被子類繼承后仍然是public的。

2. protected
從語義角度上來說,protected繼承是一種實(shí)現(xiàn)繼承,根據(jù)面向?qū)ο笾械年P(guān)系而言就是,子類不能代替父類完成父類接口所聲明的行為,也就是不符合“Liskov替換原則(LSP)”,此時(shí)子類不能自動(dòng)轉(zhuǎn)換成為父類的接口。

就算通過類型轉(zhuǎn)換(static_cast和dynamic_cast)也會(huì)得到一個(gè)空指針。從語法角度上來說,protected繼承會(huì)將父類中的public可見性的成員修改成為protected可見性,相當(dāng)于在子類中引入了protected成員,這樣一來在子類中同樣還是可以調(diào)用父類的protected和public成員,子類的子類就也可以調(diào)用被protected繼承的父類的protected和public成員。

3. private
從語義角度上來說,private繼承是一種實(shí)現(xiàn)C++類繼承,根據(jù)面向?qū)ο笾械年P(guān)系而言就是,子類不能代替父類完成父類接口所聲明的行為,也就是不符合“Liskov替換原則(LSP)”,此時(shí)子類不能自動(dòng)轉(zhuǎn)換成為父類的接口。

就算通過類型轉(zhuǎn)換(static_cast和dynamic_cast)也會(huì)得到一個(gè)空指針。從語法角度上來說,private繼承會(huì)將父類中的public和protected可見性的成員修改成為private可見性,這樣一來雖然子類中同樣還是可以調(diào)用父類的protected和public成員,但是在子類的子類就不可以再調(diào)用被private繼承的父類的成員了。

class CSample1 {       protected:           void printProtected() {}       public:           void printPublic() {}       };       class CSample2 : protected CSample1 {              };       class CSample3 : public CSample2 {           void print3() {               printProtected();               printPublic();           }       };

在面向?qū)ο蟮睦碚撝杏袃煞N概念:接口、實(shí)現(xiàn),所以就出現(xiàn)了所謂的接口繼承和實(shí)現(xiàn)繼承兩種關(guān)系。而protected和private就是實(shí)現(xiàn)繼承中所要用到的,其實(shí)protected和private兩者則約束繼承時(shí)并沒有形成兩種不同的繼承類別,而僅僅只是為了方便C++類方法的傳遞調(diào)用而設(shè)計(jì)的。

其實(shí)在java這樣面向?qū)ο笠蟾鼮閲?yán)格的語言當(dāng)中,沒有實(shí)現(xiàn)繼承,他必須通過委托方式來完成這一概念,如果熟悉java就會(huì)明白,如果一個(gè)對象要使用另外一個(gè)對象的接口功能,而自身又不能夠充當(dāng)該對象所扮演的角色時(shí),就會(huì)通過委托來完成。

這樣一來就必須在對象中包含一個(gè)委托對象,通過對象調(diào)用語法來完成功能;在C++中就可以通過protected和private繼承來完成java中的委托關(guān)系(當(dāng)然C++也可以形成對象委托關(guān)系),那么這種情況下protected繼承就容許委托可以傳遞(也就是被多級子類調(diào)用),而private繼承是不容許委托被傳遞的。

看完上述內(nèi)容,你們對如何解析C++類繼承關(guān)系問題有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道,感謝大家的支持。

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

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

c++
AI