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...