以下是我從網路上摘錄下來的,感覺看完這些精華討論估計對虛函式和純虛函式也理解差不多了。。。
1.虛函式
參考書籍: com本質論 侯捷老師的 深入淺出mfc
疑問1:
若是為了繼承,那麼普通的類(沒有虛函式,純虛函式)就可以被繼承,而且工作的相當好.虛函式倒是可以理解,應該是可以通過,乙個指向基類物件的指標能夠依據實際的指向,來呼叫不同的函式,實現多型.而純虛函式難道就是為了實現介面?介面存在的意義,我實在弄不懂,我幹嘛要預先定義好?未來的事情本難料就等有一天我的類中需要使用某個函式,在新增乙個函式不久可以?
疑問2:
為什麼要用虛函式,僅僅是為了子類可以重寫它嗎?不是虛函式我也可以重寫它呀?派生類中和基類中有同簽名函式,通過派生類物件訪問這個函式時,應該優先執行派生類的函式,如果派生類沒有這個函式才去執行基類中這個同名函式(公有繼承時)。
上述可能是大部分深入學習c++朋友的典型疑惑.
用具體例子回答:
例子1:
有純虛函式的類是不可能生成類物件的,如果沒有純虛函式則可以。
class ca
;
class cb
;
// ca,cb類的實現
...
void main()
例子2:
"每本書"都有作者,每本書都是都從抽象基類"書"繼承而來
然而"書"沒有作者,所以我們"書"為定義乙個純虛函式「作者」
這意味著"書"不能被例項化,但是可以通過"書"的指標列舉每本書的作者!
但如果這些"作者"有一些共同的屬性,我們可以把它寫進基類,這是就成了虛函式!
從功能上講,無論虛函式和純虛函式都可以達到同樣的目的。
但是純虛函式可以使結構更清楚一些。
純虛函式可以保證子類必須實現自己的函式(這是一種強制手段),而虛函式則不保證。
如果在虛函式的情況下,你可以繼承乙個基類,而不過載該函式(這可能是你故意的,也
有可能是你無意中忘記了),編譯器不知道你的意圖。有了純虛函式,則可保證重要的函式
必須被重新定義。
你要生乙個孩子,
首先,你要定義乙個人,
這個人不是誰誰誰,
然後這個人的所有功能都預定義,不過都沒有實現,但是大家知道他是乙個人,否則他就是不是人。
接著,還是生出來了,
他便實現了人的所有功能,
呵呵,純虛函式就是這樣的。
在《com技術內幕》上抄來的,可能有用:
"...(實現繼承)使得乙個物件的實現同另乙個物件的實現緊緊的關聯起來。在這種情況下,當基類的實現被修改之後,派生類將無法正常執行而必須被修改。對於乙個中等規模的c++程式而言,這或許並不成問題,因為在這種情況下,我們一般能夠獲得所有的源**,也能夠對所有的派生類進行修改。但是對於較大的c++程式而言,對受影響的派生類進行修改所花費的時間將是相當長的。更糟的是,我們可能根本無法得到所有的源**。這就是為什麼一些用c++編寫大型程式的專家們強烈建議人們基於抽象基類來構建應用程式的原因。"
例子3:
比如你要設計類庫
基類是「形狀」
class 形狀
這個時候你是無法實現draw函式的,因為你不知道是什麼樣的形狀?
好了,現在可以派生了
class 園 : public 形狀
class 矩形 : public 形狀
到了子類就可以具體實現了。你可能會說不定義「形狀」類,直接定義「園「和「矩形"類得了。
但是,有了形狀類整個**就清晰了,所用的畫的函式都是draw,而不是drawcircle, drawrectangle等等。
關於虛函式的精華討論
以下是我從網路上摘錄下來的,感覺看完這些精華討論估計對虛函式和純虛函式也理解差不多了。1.虛函式 參考書籍 com本質論 侯捷老師的 深入淺出mfc 疑問1 若是為了繼承,那麼普通的類 沒有虛函式,純虛函式 就可以被繼承,而且工作的相當好.虛函式倒是可以理解,應該是可以通過,乙個指向基類物件的指標能...
虛函式相關討論
下列關於虛函式相關說法正確的有?1 多型是通過虛表實現的 2 建構函式可以宣告為虛函式 x 3 析構函式不可以宣告為虛函式 x 4 抽象類中至少包含乙個純虛函式 c 中 的虛函式的作用主要是實現了多型的機制。而虛函式是通過虛函式表 v table 實現的。建構函式為什麼不能宣告為虛函式?1 構造乙個...
關於虛函式
虛函式的作用是實現 動態聯編 也就是在程式的執行階段動態地選擇合適的 成員函式 在定義了虛函式後,可以在基類的 派生類中對虛函式重新定義,在派生類中重新定義的函式應與虛函式具有相同的 形參個數和形參型別。以實現統一的介面,不同定義過程。如果在 派生類中沒有對虛函式重新定義,則它繼承其 基類的虛函式 ...