---恢復內容開始---
在c++中的一種函式申明被稱之為:純虛函式(pure virtual function).它的申明格式如下
class在什麼情況下使用純虛函式(pure vitrual function)?cshape
;
1,當想在基類中抽象出乙個方法,且該基類只做能被繼承,而不能被例項化;
2,這個方法必須在派生類(derived class)中被實現;
如果滿足以上兩點,可以考慮將該方法申明為純虛函式(pure virtual function).
#include #include下面我們看一道某公司的面試的筆試題(含金量到底有多少??)#include
using
namespace
std;
class
abstractcls
virtual
void showmember()= 0; //
純虛函式的定義
protected
:
float
speed;
inttotal;
};class car : public
abstractcls
virtual
void
showmember()
protected
:
intaird;
};int
main()
#include #include先不要看答案,看自己能否作對??using
namespace
std;
class
a
virtual
void
fuu()
};class b:public
a
void
fuu()
};int
main()
下面進行詳細分析一下為什麼結果是這樣的??你全做對了沒??
第乙個p->foo()和p->fuu()都很好理解,本身是基類指標,指向的又是基類物件,呼叫的都是基類本身的函式,因此輸出結果就是1、2。
第二個輸出結果就是1、4。p->foo()和p->fuu()則是基類指標指向子類物件,正式體現多型的用法,p->foo()由於指標是個基類指標,指向是乙個固定偏移量的函式,因此此時指向的就只能是基類的foo()函式的**了,因此輸出的結果還是1。而p->fuu()指標是基類指標,指向的fuu是乙個虛函式,由於每個虛函式都有乙個虛函式列表,此時p呼叫fuu()並不是直接呼叫函式,而是通過虛函式列表找到相應的函式的位址,因此根據指向的物件不同,函式位址也將不同,這裡將找到對應的子類的fuu()函式的位址,因此輸出的結果也會是子類的結果4.
第三個並不是很理解這種用法,從原理上來解釋,由於b是子類指標,雖然被賦予了基類物件位址,但是ptr->foo()在呼叫的時候,由於位址偏移量固定,偏移量是子類物件的偏移量,於是即使在指向了乙個基類物件的情況下,還是呼叫到了子類的函式,雖然可能從始到終都沒有子類物件的例項化出現。
第四個:而ptr->fuu()的呼叫,可能還是因為c++多型性的原因,由於指向的是乙個基類物件,通過虛函式列表的引用,找到了基類中foo()函式的位址,因此呼叫了基類的函式。由此可見多型性的強大,可以適應各種變化,不論指標是基類的還是子類的,都能找到正確的實現方法。
小結:1.有virtual才可能發生多型現象2.不發生多型(無virtual)呼叫就按原型別呼叫
C 中的虛函式 純虛函式
c 最重要的特性就是多型,而多型,就主要通過虛函式實現的。具體的實現過程是 基類中的函式定義為虛函式,派生類發生覆蓋 即函式名稱 引數列表 返回值型別完全相同 的情況下,派生類中的函式也會自動變成虛函式,不論加不加virtual關鍵字。此時,基類與子類物件中都會存在一張虛函式表 因為含有虛函式 具體...
C 中的純虛函式
一 定義.純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加 0 virtual void funtion1 0 二 引入原因 1 為了方便使用多型特性,我們常常需要在基類中定義虛函式。2 在很多情況下,基類本身生成...
C 中的純虛函式
一 定義.純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加 0 virtual void funtion1 0 二 引入原因 1 為了方便使用多型特性,我們常常需要在基類中定義虛函式。2 在很多情況下,基類本身生成...