抽象類出現的原因?(技術問答之精闢回答收藏)

2021-07-08 10:11:58 字數 885 閱讀 7747

這個問題沒辦法簡單回答。

首先要搞清楚的是繼承有什麼用,函式重寫有什麼用。繼承和函式重寫實現的是**的復用(一次編寫,重複使用)

從最簡單的說起。你編寫了乙個函式,你希望下次還要用,你怎麼做?直接呼叫就是了,是不是?

那麼我問你,如果你下次要用,但是**不完全一樣,需要修改下,怎麼用?你有兩個辦法:(1)複製乙份**,再建乙個函式。然後在裡面改。(2)直接在原來的函式中改,為了保證原來函式的呼叫的正確,你需要加乙個引數,比如type,然後在需要修改的地方增加乙個if判斷,如果是type=1,走原來的邏輯,否則走修改的邏輯。

你能說出這兩個辦法的問題麼?顯然方法1,增加了很多重複的**不說,而且如果發現這個函式別的地方有bug,需要修改,你同時要修改兩份**,很容易忘記。

方法2,你修改了函式的引數,那麼所有原先的呼叫者都要找出來跟著修改。而且,這個方法的問題還在於,你需要直接修改人家寫好的函式,如果是乙個團隊開發,乙個函式改來改去,你的**被別人修改了你都不知道,你下次呼叫,發現多了乙個引數,你問誰去?

那麼怎麼解決?用繼承和函式重寫。定義乙個類,把函式寫好,其中函式中可能需要擴充套件和變化的地方,提取出來放在另乙個函式中,這個函式作為虛函式。

需要修改函式怎麼辦?不需要直接在**上修改,只要派生乙個這個型別,重寫那個虛方法,就可以實現**的替換了。

以上我說的很簡略,你自己需要看書理解,並且寫幾個程式體會下。

知道了繼承和重寫是幹嘛的,現在回答你的問題,抽象類是幹嘛的。有時候我們需要編寫一些預製的**,但是這些**中的某一部分我們沒有辦法給乙個具體的實現。

打乙個比方,我們設計乙個抽象的流的**,給這個流讀取、寫入、序列化、轉換為字串、轉接到另乙個流等操作。顯然,其它方法我們可以寫出來,但是讀取寫入我們沒法寫。不同的流,io是不同的,對不對?

此時我們怎麼做?只能用抽象類了。

抽象類出現的原因

這個問題沒辦法簡單回答。首先要搞清楚的是繼承有什麼用,函式重寫有什麼用。繼承和函式重寫實現的是 的復用 一次編寫,重複使用 從最簡單的說起。你編寫了乙個函式,你希望下次還要用,你怎麼做?直接呼叫就是了,是不是?那麼我問你,如果你下次要用,但是 不完全一樣,需要修改下,怎麼用?你有兩個辦法 1 複製乙...

抽象類出現的原因

這個問題沒辦法簡單回答。首先要搞清楚的是繼承有什麼用,函式重寫有什麼用。繼承和函式重寫實現的是 的復用 一次編寫,重複使用 從最簡單的說起。你編寫了乙個函式,你希望下次還要用,你怎麼做?直接呼叫就是了,是不是?那麼我問你,如果你下次要用,但是 不完全一樣,需要修改下,怎麼用?你有兩個辦法 1 複製乙...

018 linuxC 之 抽象類的引入

二 抽象類在介紹抽象類之前,我們先介紹一下純虛函式。1.純虛函式 在基類中僅僅給出宣告,不對虛函式實現定義,而是在派生類中實現。這個虛函式稱為純虛函式。普通函式如果僅僅給出它的宣告而沒有實現它的函式體,這是編譯不過的。純虛函式沒有函式體。純虛函式需要在宣告之後加個 0 class 基類 2.抽象類 ...