1. 程式人生 > >虛擬函式與多型知識點總結

虛擬函式與多型知識點總結

虛擬函式和多型

1:多型性是指一個名字,多種語義;或介面相同,多種實現。

2:虛擬函式允許函式呼叫與函式體的聯絡在執行時才進行,稱為動態聯編。

3:實現執行時多型的關鍵首先是要說明虛擬函式,另外,必須用類指標呼叫派生類的不同實現版本

4注意點:

①:一個虛擬函式,在派生類層介面相同的過載函式都保持虛特性

 ②:虛擬函式必須是類的成員函式

 三:不能將友元說明為虛擬函式,但虛擬函式可以是另一個類的友元

 ④:解構函式可以是虛擬函式,但建構函式不能是虛擬函式。

5:虛擬函式的過載特性:

①:在派生類中過載基類的虛擬函式要求函式名、返回型別、引數個數、引數型別和順序完全相同

 ②:如果僅僅返回型別不同,C++認為是錯誤過載。如果函式原型不同,僅函式名相同,丟失虛特性

6:虛解構函式:

①:建構函式不能是虛擬函式。建立一個派生類物件時,必須從類層次的根開始,沿著繼承路徑逐個呼叫基類的建構函式

②:解構函式可以是虛的。虛解構函式用於指引 delete 運算子正確析構動態物件

7建構函式、內聯成員函式、靜態成員函式不能是虛擬函式。

8解構函式可以是虛擬函式,通常宣告為虛擬函式。

9:純虛擬函式和抽象類:

純虛擬函式是一種特殊的虛擬函式,在許多情況下,在基類中不能對虛擬函式給出有意義的實現,而把它宣告為純虛擬函式,它的實現留給該基類的派生類去做。

二:典型程式碼:

#include<iostream>
using namespace std ;
class  Base
{ public :       Base(char xx)  { x = xx; }
                      void who()  { cout << "Base class: " << x << "\n" ; }
   protected:    char x;
} ;
class  First_d : public  Base
{ public :       First_d(char xx, char yy):Base(xx)  { y = yy; }
                      void who()  { cout << "First derived class: "<< x << ", " << y << "\n" ; }
   protected:    char y;
} ;
class  Second_d : public  First_d
{ public :
      Second_d( char xx, char yy, char zz ) : First_d( xx, yy ) { z = zz; } 
      void who()  { cout << "Second derived class: "<< x << ", " << y << ", " << z << "\n" ; }
   protected:    char z;
} ;
int main()
{ Base  B_obj( 'A' ) ;   First_d F_obj( 'T', 'O' ) ;  Second_d S_obj( 'E', 'N', 'D' ) ;
   Base  * p ;
   p = & B_obj ;    p -> who() ;
   p = &F_obj ;     p -> who() ;
   p = &S_obj ;     p -> who() ;
   F_obj.who() ;
   ( ( Second_d * ) p ) -> who() ;
}