1樓:網友
多型分為靜態多型和動態多型。
靜態多型靠過載實現。
動態的多型需要虛擬函式和繼承相結合實現。
2樓:網友
虛擬函式可以讓成員函式操作一般化,用基類的指標指向不同的派生類的物件時,基類指標呼叫其虛成員函式,則會呼叫其真正指向物件的成員函式,而不是基類中定義的成員函式(只要派生類改寫了該成員函式)。
若不是虛擬函式,則不管基類指標指向的哪個派生類物件,呼叫時都會呼叫基類中定義的那個函式。
有關c++類繼承為什麼使用同名虛擬函式的問題
3樓:網友
虛擬函式或者動態聯編的主要目的就是,在還沒寫出派生類的時候,就已經寫出了呼叫那個函式的**,如果在派生類中叫其它名字,誰知道怎麼呼叫它,那不是和沒寫一樣。
如果乙個函式,要先寫出派生類,然後才呼叫它,那這個函式就沒必要是虛擬函式,也就沒有動態聯編,當然叫什麼名字都無所謂。
至於虛擬函式呼叫的執行代價,如果稱得上「比較大」的話,那麼幾乎所有c/c++之外的語言都可以說是「完全沒法用」了。
4樓:匿名使用者
既然看不到 object-oriented programming 的好處,那麼不要用就是了。本來 object-oriented programming 就不是唯一的程式設計正規化。
5樓:網友
繼承的思想,利用函式重寫使得模組中的功能顯得很清晰,同時在多型中還有很大的用處。
6樓:紅塵行動者
虛擬函式是為了實現多型,多型是c++的三大特性之一,這應該有利於維護。
c++繼承多型問題,為何此處必須寫上預設建構函式才可編譯通過?註釋掉會報錯
7樓:匿名使用者
如果寫上了帶引數的建構函式, 那麼編譯器就不會自動給你補上預設建構函式。
子類必須呼叫父類的建構函式, 如果你沒寫那麼編譯器會呼叫預設建構函式。
c++ 多型繼承時,使用虛擬函式的方式。如果定義的時候不使用虛擬函式virsual定義會怎麼樣
8樓:小鬧心峰
繼承誰,基類或抽象類是誰,多型性就由誰派生。虛擬函式,純虛擬函式的派生多型原理只是在基類或抽象類儲存乙份虛擬函式表而已。
c++中 繼承與多型區別
9樓:網友
繼承是指,子類可以自動獲得父類提供的函式,如父類提供了foo函式回,則子類也會有foo函式。
多型是指。答,子類可以重寫父類的某個函式,從而為這個函式提供不同於父類的行為。乙個父類的多個子類可以為同乙個函式提供不同的實現,從而在父類這個公共的介面下,表現出多種行為。
當然,以上的自動獲得和重寫,還存在乙個訪問級別的概念。比如public的函式或者protected的函式才能被重寫這類的限制。
10樓:許詩文
繼承:是指子類按照一定方式繼承基類的成員及函式。
如果此時定義乙個基類的指標,並把子類的物件傳給這個基類指標。假如子類和基類都有乙個相同函式。那麼這個指標呼叫這個函式則到底呼叫的是基類的函式還是子類的函式呢?
答案是:基類的函式。因為函式的呼叫取決於基類的指標型別,而不是取決於指標指向的物件型別。
如下:class shape
class crect:public shape
shape* pshape;
crect rct;
pshape=&rct; //指向子類物件,最好不要用乙個子類指標指向乙個基類物件,因為這樣危險性大。
pshape->display();//它呼叫的仍然是基類的shape的display函式即畫乙個多邊形以上的這種特性就是函式的一般性,即指標呼叫的函式取決於指標型別,而不取決於指向的物件型別。假如這個基類派生了很多子類,且每個子類都定義了個函式對基類的函式進行覆蓋,此時多個基類指標指向不同子類物件,呼叫子類的覆蓋函式,則這些指標的行為都是一樣的,即都是呼叫基類的函式而不是子類相對應的函式。
從上可以看出,這種特性並不具有多型性,因為它不會自動隨著指向的物件而呼叫物件的函式。那麼如何能實現這種特性呢?這時就需要一種技術,即虛擬函式。虛擬函式是實現多型性的方法。
虛擬函式就是在函式的前面加上乙個virtual即可。
虛擬函式中有一種比較特別:純虛擬函式。
它的目的:純虛擬函式不能定義函式的實際動作,它的存在只是為了在衍生類別中對它能夠進行重新定義,實現實態特性。
它的定義方式: virtual 函式型別 函式名(引數)= 0; //一定要「= 0」
它的約束:如果乙個類中有純虛擬函式,則這個類叫做抽象類,它是不能定義物件的。
在c++中虛擬函式和多型性是什麼意思
11樓:網友
虛擬函式是在基類中定義的,目的是不確定它的派生類的具體行為。例:
定義乙個基類:class animal//動物。它的函式為breathe()//呼吸。
再定義乙個類class fish//魚 。它的函式也為breathe()
再定義乙個類class sheep //羊。它的函式也為breathe()
為了簡化**,將fish,sheep定義成基類animal的派生類。
然而fish與sheep的breathe不一樣,乙個是在水中通過水來呼吸,乙個是直接呼吸空氣。所以基類不能確定該如何定義breathe,所以在基類中只定義了乙個virtual breathe,它是乙個空的虛擬函式。具本的函式在子類中分別定義。
程式一般執行時,找到類,如果它有基類,再找它的基類,最後執行的是基類中的函式,這時,它在基類中找到的是virtual標識的函式,它就會再回到子類中找同名函式。派生類也叫子類。基類也叫父類。
這就是虛擬函式的產生,和類的多型性(breathe)的體現。
這裡的多型性是指類的多型性。
函式的多型性是指乙個函式被定義成多個不同引數的函式,它們一般被存在標頭檔案中,當你呼叫這個函式,針對不同的引數,就會呼叫不同的同名函式。例:rect()//矩形。
它的引數可以是兩個座標點(point,point)也可能是四個座標(x1,y1,x2,y2)這叫函式的多型性與函式的過載。
c++中,虛擬函式能不能被繼承
12樓:閃閃紅紅星
必然能。虛擬函式不僅能被繼承,還能被改寫,這就是虛擬函式區別於普通函式的地方。
13樓:
可以繼承,多型性就是虛擬函式的作用,定義乙個父類指標,指向不同的子類物件,就可以呼叫子類中的虛擬函式。
14樓:流逝____的
虛擬函式可以被繼承,多型性。
為什麼要使用多型,而不直接使用派生類物件呼叫虛擬函式
15樓:書玄
呼叫基類的,只要使用指標或引用呼叫才能觸發多型,才會呼叫派生類的虛擬函式。
我一直對C 中的虛擬函式,建構函式,繼承,派生之類的感到頭痛,感覺很亂,好像大多數程式都要用到這些
1.c 語言從c發展而來,它最引以為傲的特點就包括類的多型性,也就是你說的虛擬函式,c 的多型實現包含三個基本要素 類的繼承層次 類的引用跟指標 基類必須有虛擬函式,在滿足這三個條件的前提下,c 實現了動態型別識別然後根據實際型別呼叫虛擬函式。說起來似乎挺複雜,其實道理很簡單,就是為了根據實際物件型...
函式與極限的是隨便取嗎,函式極限中的為什麼可以任意給定
對於任意的 0存在 0,當 x x0 時,f x a 則函式f x 在x0處的極限為a。是任意取的正數,都能找到合適的正數 函式極限中的 為什麼可以任意給定?樓主之所以問出這樣的問題,說明了兩個方面 1 樓主是喜歡思考的人,不是人云亦云 不知所云的人 拿數列極限來講 lim xn a 對於任意的 0...
為什麼說函式是C語言的基本單位 ?
人們在求解乙個複雜問題時,通常採用的是逐步分解 分而治之的方法,也就是把乙個大問題分解成若干個比較容易求解的小問題,然後分別求解。程式設計師在設計乙個複雜的應用程式時,往往也是把整個程式劃分為若干功能較為單一的程式模組,然後分別予以實現,最後再把所有的程式模組像搭積木一樣裝配起來,這種在程式設計中分而治...