C 疑問,實現多型性一定要用到虛擬函式嗎

時間 2022-02-26 18:50:03

1樓:匿名使用者

我的理解:多型性,即一個父類的引用,可以指向派生類的物件(引用的訪問許可權取決於引用的型別,而非物件型別)。

你這樣在派生類中,寫一個與父類具有相同簽名的成員方法,是覆蓋

(有些地方說,只有虛方法才能覆蓋,你可以把派生類的方法註釋了,執行下,看看結果)。這個和多型性貌似沒什麼關係.

base *p=new derived; p->fun();(此處將呼叫父類的fun方法,p的訪問許可權為base的許可權)

這才稱之為多型。p是一個base型別的引用,指向了derived的一個例項化物件。

2樓:匿名使用者

base *ptr=new base;

ptr->fun();

ptr=new derived;

ptr->fun();

你在試試!

我的意思是實現多型性要是指向基類的指標,要不你看看書是不是這要的。

你寫的那兩個是一個意思當然輸出的都是derivedfun

3樓:北風微風

你的程式裡的沒有體現多型,因為多型是對於不同型別的物件接受到相同的訊息,然後做出不同的響應,比如自行車和汽車的行駛是完全不同的行為,雖然要到的目的都是行駛。

多型分為靜態多型和動態多型,靜態多型是編譯時的多型,有函式過載和模版;動態多型是執行時的多型,需要通過繼承加虛擬函式實現。

在c++中用虛擬函式的作用是什麼?為什麼要用到虛擬函式

4樓:阿亮臉色煞白

虛擬函式:在某基類中宣告為 virtual 並在一個或多個派生類中被重新定 義的成員函式,用法格式為:virtual 函式返回型別 函式名(參數列) ;實現多型性,通過指向派生類的基類指標或引用,訪問派生類中同名覆蓋成員函式。

眾所周知,在同一類中是不能定義兩個名字相同、引數個數和型別都相同的函式的,否則就是「重複定義」。但是在類的繼承層次結構中,在不同的層次中可以出現名字相同、引數個數和型別都相同而功能不同的函式。例如在例12.

1(具體**請檢視:c++多型性的一個典型例子)

程式中,在circle類中定義了

area函式,在circle類的派生類cylinder中也定義了一個area函式。這兩個函式不僅名字相同,而且引數個數相同(均為0),但功能不

同,函式體是不同的。前者的作用是求圓面積,後者的作用是求圓柱體的表面積。這是合法的,因為它們不在同一個類中。

編譯系統按照同名覆蓋的原則決定呼叫的物件。在例12.1程式中用cy1.area( )

呼叫的是派生類cylinder中的成員函式area。如果想呼叫cy1 中的直接基類circle的area函式,應當表示為

cy1.circle::area()。用這種方法來區分兩個同名的函式。但是這樣做 很不方便。

人們提出這樣的設想,能否用同一個呼叫形式,既能呼叫派生類又能呼叫基類的同名函式。在程式中不是通過不同的物件名去呼叫不同派生層次中的同名函式,而是通過指標呼叫它們。例如,用同一個語句「pt->display( );」可以呼叫不同派生層次中的display函式,只需在呼叫前給指標變數 pt 賦以不同的值(使之指向不同的類物件)即可。

打個比方,你要去某一地方辦事,如果乘坐公交車,必須事先確定目的地,然後乘坐能夠到達目的地的公交車線路。如果改為乘計程車,就簡單多了,不必查行車路

線,因為計程車什麼地方都能去,只要在上車後臨時告訴司機要到**即可。如果想訪問多個目的地,只要在到達一個目的地後再告訴司機下一個目的地即可,顯

然,「打的」要比乘公交車 方便。無論到什麼地方去都可以乘同—輛計程車。這就是通過同一種形式能達到不同目的的例子。

c++中的虛擬函式就是用來解決這個問題的。虛擬函式的作用是允許在派生類中重新定義與基類同名的函式,並且可以通過基類指標或引用來訪問基類和派生類中的同名函式。

在c++中虛擬函式和多型性是什麼意思

5樓:go陌小潔

多型是指使用相同的函式名來訪問函式不同的實現方法,即「一種介面,多種方法」,用相同的形式訪問一組通用的運算,每個運算可能對應的行為不同。c++支援編譯時多型和執行時多型,運算子過載和函式過載就是編譯時多型,而派生類和虛擬函式實現執行時多型。執行時多型的基礎是基類指標,基類指標可以指向任何派生類物件。

虛擬函式與基類指標在一起時會有奇妙的現象。

1.虛擬函式是為了實現多型而存在的

請看以下程式:

#include <<

using namespace std;

class f

virtual void vir()

};class s : public f

void vir()

};int main()

輸出:[root@localhost root]# ./vir

son novir

son vir

father novir

father vir

father novir

son vir

例如:父類為 車,子類為汽車

子類指標不能指向父類物件(即將父類物件賦值給子類指標):

因為子類中有些資訊父類沒有,如果用指標訪問的時候很可能訪問到父類沒有的一些屬性及函式,會出錯。父類的物件可以有很多,自行車,摩托車,轎車等,如果用一個父類的物件賦給子類汽車的指標,汽車有的屬性,例如發動機,父類物件就沒有,會產生錯誤。

父類指標可以指向子類物件(即將子類物件賦值給父類指標):

由於繼承的關係,子類物件同樣也是父類的物件,例如:汽車有輪子,汽車也屬於車,父類車也有輪子,這種情況下,子類物件就成為了父類的一個物件,所以只能操作父類有的屬性及函式。對於那些父類沒有的屬性,必須將父類指標強制轉化為子類指標後才可使用。

虛擬函式的多型體現

我們都知道,程式執行的過程要經過 預處理,編譯,執行,連結等步驟。虛擬函式在程式執行的時候才被繫結,編譯的時候不進行相關處理,只有執行的時候才對其進行相關操作。

所以在程式片:

f *ff;

ff = &s;//將一個父類指標指向一個子類物件;子類指標不能指向父類物件

ff->novir();//父類起作用,顯示father novir

ff->vir();//子類起作用,虛擬函式多型的用處,顯示 son vir

程式在執行時決定呼叫虛擬函式的哪個定義,這個決定依賴於基型別指標所指向的物件的型別。通過點運算呼叫虛擬函式時,忽略了虛擬函式的多型性,**只有**使用***基型別指標訪問虛擬函式***,執行時的多型性才得以體現。即c++根據指標指向物件的型別來決定呼叫虛擬函式的哪個定義,在這裡,指標所指向的型別為子類物件,所以虛擬函式使用子類的函式。

6樓:

虛擬函式是在基類中定義的,目的是不確定它的派生類的具體行為。例:

定義一個基類: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++的虛擬函式是不是沒有方法體的函式?

7樓:匿名使用者

虛擬函式不是沒有方法體,只是方法體可以不立即給出,留待後續的繼承來實現。普通的類成員函式是會要求在編譯時就給出實際函式的實際地址的,而虛擬函式數就不一樣,是在執行時才給出,這也是c++多型性的體現。

8樓:匿名使用者

在基類中用關鍵字virtual修飾的成

員函式稱為虛擬函式。用虛擬函式實現動態多型性。定義基類時,若無法定義基類中虛擬函式的具體操作,虛擬函式的具體操作完全取決於其在不同的派生類,這時,在基類中的虛擬函式定義為純虛擬函式,定義的格式:

virtual 《型別》《函式名》《形參》=0;

此時的純虛擬函式沒有函式體,你說的大概是這個意思吧。

9樓:匿名使用者

虛擬函式是為了讓指向基類的指標也能訪問派生類而在基類定義的。也可以指定為純虛擬函式,僅為繼承而用。

c++中多型性就是虛擬函式?

10樓:匿名使用者

多型就是一種呼叫方式可以得到不同結果,因此我更認為就是繼承+虛擬函式。至於過載個人認為不是多型,因為它呼叫方式不同,只有函式名字一樣

11樓:

分靜態多肽和動態多型性,虛擬函式實現動態多型性,過載實現靜態多型性

12樓:匿名使用者

多型就是虛擬函式, 可以這樣理解。

13樓:匿名使用者

不是的 ,多臺是相對物件導向講的

關於C 多型性的問題,一個關於C 多型性的問題

真水無香耶 多型性 polymorphism 是物件導向程式設計的基本特徵之一。而在c 中,多型性通過虛擬函式 virtual function 來實現。我們來看一段簡單的 include using namespace std class base virtual void fun2 virtua...

女生請進,解答疑問,認真回答的一定採納

哈哈,其實我的腳也臭,不過都是因為穿鞋不當。比如襪子不經常換,腳不注意衛生,或者穿球鞋或者皮鞋不穿襪子。就會臭。如果知道自己會腳臭,平時就應該保持衛生習慣。穿的鞋子保持透氣。夏天的時候穿涼鞋。反正我是習慣自己的腳臭了。所以不覺得的臭啊 臭都是別人說的,誒 其實每個人的腳都是有味道的,我也不知道為什麼...

C語言實現程式後臺執行,一定要C語言 可用dev C 不能用VC

c語言會被編譯器編譯成彙編,作業系統提供一個資源許可權的空間來讓其執行。這其中c語言的一些你看起來很簡單的操作如printf等都是有一個函式庫來支援的,這些函式庫實質上是作業系統提供一些api封裝後的樣子,這樣使用起來更加方便。不同的作業系統提供的api是有些不同的,這些有相應的lib來解決,你在c...