消極的多型與積極的多型

2022-09-03 01:30:10 字數 1055 閱讀 4913

消極的多型:

point *ptr;

ptr=new point2d;

其中,point為基類,point2d為point類的派生類,這種多型稱為消極的多型。這種多型形式在編譯時期就已完成,ptr扮演乙個輸送機制,這樣在程式的任何地方均可以使用ptr來指向任意乙個派生類。他被稱為消極的,是因為沒有對派生類行程使用,只是單單的用基類指標指向派生類。

積極的多型:

ptr->z();

其中,z()為對虛函式的呼叫。這種多型成為積極的多型。這種多型形式在執行時期進行。他被稱為積極的多型是因為其真正利用基類指針對派生類成員進行了呼叫。

為了實現積極的多型應該做什麼?

ptr是乙個基類指標,儘管在編譯時期就通過消極的多型將它與派生類物件聯絡起來了,但這只是將派生類的位址賦予了基類指標,實際上在編譯時期我們並不知道ptr指向的到底是基類還是派生類,需要做什麼才能實現通過基類指標來實現呼叫所指向物件的正確版本的虛函式呢?

1.ptr所指物件的真實型別。即ptr到底是指向基類的物件還是指向派生類的物件,不同的指向將呼叫不同的虛函式z();

2.z()實體的位置。可能存在不止乙個虛函式,如何找到正確的要呼叫的z()的位址。

解決問題1,需要在class中增加乙個字串或數字,指明class的型別。

解決問題2,需要在class中增加乙個指標,指向某**,**中帶有虛函式的執行期位址。

對於ptr->z();

編譯時期將該呼叫轉化為:(*ptr->vptr[4])(ptr);

其中,vptr[4]表示z()在vptr所指向**中的slot索引,在單一繼承體系中,所有的z()全部都被放在vptr[4]的位置,因此唯一在執行器所需要做的,就是問題1,即確認ptr的指向,slot4到底指的是哪個乙個z()的實體,是基類的還是派生類的。      

消極的態度,積極的責任。

以前看過一篇文章,說80後是無愛的一代,當時感觸不深,最近忽然有了同感。起初,大家都對愛情報以希望,認為可以很美好,但經歷了很多事後,才認識到所謂的美好,只是一種憧憬罷了。也許是我幼稚,沒家長看的遠,想多的,在種種困難後,終於各奔東西,傷了她,同時也傷了我自己,如果這也算不上傷的話,至少現階段,對曾...

類的多型與多型性

多型是指一類事物有多種形態 class animal def speak self print f 開口說話 動物的形態之一 人 class people animal def speak self print 呵呵呵 動物的形態之二 狗 class duck animal def speak se...

C 多型 靜態多型與動態多型

多型 顧名思義,多型就是多種形態,也就是對不同物件傳送同乙個訊息,不同物件會做出不同的響應。並且多型分為靜態多型和動態多型。靜態多型就是在系統編譯期間就可以確定程式執行到這裡將要執行哪個函式,例如 函式的過載,物件名加點操作符執行成員函式等,都是靜態多型,其中,過載是在形成符號表的時候,對函式名做了...