什麼函數不能聲明爲虛函數

什麼函數不能聲明爲虛函數 收藏

一、首先回顧下什麼是虛函數及其作用,以便更好理解什麼函數不能聲明或定義爲虛函數

1. 定義:

虛函數必須是基類的非靜態成員函數,其訪問權限可以是protected或public,在基類的類定義中定義虛函數的一般形式:

  virtual 函數返回值類型 虛函數名(形參表)  { 函數體 }

2. 作用:

虛函數的作用是實現動態聯編,也就是在程序的運行階段動態地選擇合適的成員函數,在定義了虛函數後,可以在基類的派生類中對虛函數重新定義,在派生類中重新定義的函數應與虛函數具有相同的形參個數形參類型,以實現統一的接口,不同定義過程。如果在派生類中沒有對虛函數重新定義,則它繼承其基類的虛函數。

當程序發現虛函數名前的關鍵字virtual後,會自動將其作爲動態聯編處理,即在程序運行時動態地選擇合適的成員函數。

3. 使用方法:

動態聯編規定,只能通過指向類的指針基類對象的引用來調用虛函數,其格式:

  指向基類的指針變量名->虛函數名(實參表)

      基類對象的引用名. 虛函數名(實參表)

4. 其它說明:  

虛函數是C++多態的一種表現:

例如:子類繼承了父類的一個函數(方法),而我們把父類的指針指向子類,則必須把父類的該函數(方法)設爲virtual(虛函數)。  使用虛函數,我們可以靈活的進行動態綁定,當然是以一定的開銷爲代價。 如果父類的函數(方法)根本沒有必要或者無法實現,完全要依賴子類去實現的話,可以把此函數(方法)設爲virtual 函數名=0 我們把這樣的函數(方法)稱爲純虛函數。  如果一個類包含了純虛函數,稱此類爲抽象類 。

 

二、什麼函數不能聲明爲虛函數:

一個類中將所有的成員函數都儘可能地設置爲虛函數總是有益的。 
設置虛函數須注意: 
1:只有類的成員函數才能說明爲虛函數; 
2:靜態成員函數不能是虛函數; 
3:內聯函數不能爲虛函數; 
4:構造函數不能是虛函數; 
5:析構函數可以是虛函數,而且通常聲明爲虛函數。

類裏面“定義”的成員函數是內聯的,但是仍然可以成爲虛函數,那麼是不是可以說“內聯函數不能成爲虛函數”這句話有問題呢,是不是應該改成“顯式定義的內聯函數不能成爲虛函數”。比如下面這個示例程序: 
#include   <iostream> 
using   namespace   std; 

class   Base{ 
        public: 
        virtual     void   f1(){cout < < "Father " < <endl;} 
        }; 
class   Drived1:public   Base{ 
        public: 
            void   f1(){cout < < "Son1 " < <endl;} 
        }; 
class   Drived2:public   Base{ 
        public: 
            void   f1(){cout < < "Son2 " < <endl;} 
        }; 

void   myPrint(Base*   pBs){ 
        pBs-> f1(); 
        } 
        
int   main() 

    Base   father; 
    Drived1   son1; 
    Drived2   son2; 
    myPrint(&father); 
    myPrint(&son1); 
    myPrint(&son2); 
    
    system( "PAUSE ");
    return   0; 

輸出: 
Father 
Son1 
Son2 

你可以發現,雖然f1在基類中定義的,按理說應該是內聯函數,但是它仍然可以成爲虛函 
數。
類中定義的成員函數(函數體在類中)能成爲虛函數,大部分編譯器能夠將雖然聲明爲inline但實際上不能inline的函數自動改爲不inline的。至於編譯器會不會將inline   and   virtual的函數照模照樣的實現,與編譯器及優化方式有關。
要想成爲虛函數,必須能夠被取到地址.內聯函數不能被取到地址所以不能成爲虛函數. 

你寫inline   virtual   void   f(),不能保證函數f()一定是內聯的,只能保證f()是虛函數(從而保證此函數一定不是內聯函數) 

對於問題: 
到底內聯函數能不能成爲虛函數? 
答案是不能.問題是你不能夠確定一個函數到底是不是inline的.inlien關鍵字只是對編譯器的一個建議:"如果有可能,請把此函數搞成inline的"

發佈了35 篇原創文章 · 獲贊 4 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章