1樓:ok洛陽水席
virtual 多型即指動多型
動多型是通過繼承、虛擬函式(virtual)、指標來實現。
class a
}class b : public a
}使用:
a a* = b();
a->func();
輸出:b::func()
編譯期是不呼叫任何函式的,編譯器編譯到a->func()時只是檢查有沒有語法問題,經過檢查沒有。編譯器並不知道呼叫的是a版本的func()還是b版本的func(),由於a是一個指向b物件的指標,所以a只知道它指向的是一個a型別(或者能轉換成a型別)的物件。通常整合體系就說明了(由於是公有繼承)b是一種a。
在執行期,a要呼叫a所指向物件的func()函式,就對它指向的物件下達呼叫func()的命令,結果a所指向的是一個b物件,這個物件就呼叫了自己版本(b版)的func()函式,所以輸出時b::func()
與過載的區別:
(1) 過載的幾個函式必須在同一個類中;
覆蓋的函式必須在有繼承關係的不同的類中
(2) 覆蓋的幾個函式必須函式名、引數、返回值都相同;
過載的函式必須函式名相同,引數不同。引數不同的目的就是為了在函式呼叫的時候編譯器能夠通過引數來判斷程式是在呼叫的哪個函式。這也就很自然地解釋了為什麼函式不能通過返回值不同來過載,因為程式在呼叫函式時很有可能不關心返回值,編譯器就無法從**中看出程式在呼叫的是哪個函式了。
(3) 覆蓋的函式前必須加關鍵字virtual;
過載和virtual沒有任何瓜葛,加不加都不影響過載的運作。
參考資料
2樓:空雪夢見
是這樣的,對於virtual的函式,c++編譯器會為每個這種函式在類的某個固定位置預留好一個函式指標大小的空間。
在物件構造的時候,填充這些函式指標
因為這些指標在父類和子類中位置都是固定的,所以在呼叫的時候「我要呼叫的是第一個函式」 「我要呼叫的是第二個函式」
就翻譯成
「我要呼叫第一個位置上的函式指標」 「我要呼叫第二個位置上的函式指標」
對於不同的物件,這些指標指向的**不同
於是就算是同一個型別的指標,呼叫同一個函式,也可以做到執行不同的**原理就是指標指向的物件裡,這些「函式指標」指向的**不同
虛擬函式與過載函式的區別與聯絡,C 多型性。 基類的虛擬函式和過載函式的區別,是不是一個是在執行時發生,一個是在編譯時發生?
abstract 抽象方法 virtual 虛方法 過載函式就是override的方法 比如 父類a.m 子類b.m 1 abstract的方法,父類可以不實現,讓子類去重寫 重寫 overwrite,不過一般不會提到 父類如果存在abstract方法,那麼必然是抽象類,必然不能直接例項化 比如 a...
c的特點是什麼?c的特點是什麼?談談它的多型性
c 是以c語言為基礎,支援資料抽象和麵向物件的程式設計語言。c 對c語言的擴充部分汲取了 許多著名語言中最優秀的特徵,如從algo168中吸取了操作符過載機制等。由於c 語言具有與c語言一 樣的高執行效率,並容易被熟悉c語言的軟體人員接受,因而很快得以流行。但這種混合型物件導向的 程式設計語言是一種...
矛盾的對立統一原理矛盾的對立統一性的原理是什麼
矛盾是對立統一 矛盾的基本屬性是對立性和統一性,不是鬥爭性和同一性。在馬列經典著作中,對立面或對立的一詞有下面幾種含義 一種是處於統一體中矛盾方面的差異性 另一種是指矛盾發展的一定階段,對立乃是矛盾發展到高階階段 還有一種是指矛盾對立是互相排斥的,是相互作用的。有時 對立 也有就是指的矛盾。馬克思主...