久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: C++不能聲明為虛函數的函數 [打印本頁]

作者: 51hei單片    時間: 2016-3-13 16:59
標題: C++不能聲明為虛函數的函數
一、首先回顧下什么是虛函數及其作用,以便更好理解什么函數不能聲明或定義為虛函數
1. 定義:
虛函數必須是基類的非靜態成員函數,其訪問權限可以是protected或public,在基類的類定義中定義虛函數的一般形式:
  virtual 函數返回值類型 虛函數名(形參表)  { 函數體 }
2. 作用:
虛函數的作用是實現動態聯編,也就是在程序的運行階段動態地選擇合適的成員函數,在定義了虛函數后,可以在基類的派生類中對虛函數重新定義,在派生類中重新定義的函數應與虛函數具有相同的形參個數和形參類型,以實現統一的接口,不同定義過程。如果在派生類中沒有對虛函數重新定義,則它繼承其基類的虛函數。
當程序發現虛函數名前的關鍵字virtual后,會自動將其作為動態聯編處理,即在程序運行時動態地選擇合適的成員函數。
3. 使用方法:
動態聯編規定,只能通過指向基類的指針或基類對象的引用來調用虛函數,其格式:
  指向基類的指針變量名->虛函數名(實參表)
      基類對象的引用名. 虛函數名(實參表)
4. 其它說明:  
虛函數是C++多態的一種表現:
例如:子類繼承了父類的一個函數(方法),而我們把父類的指針指向子類,則必須把父類的該函數(方法)設為virtual(虛函數)。  使用虛函數,我們可以靈活的進行動態綁定,當然是以一定的開銷為代價。 如果父類的函數(方法)根本沒有必要或者無法實現,完全要依賴子類去實現的話,可以把此函數(方法)設為virtual 函數名=0 我們把這樣的函數(方法)稱為純虛函數。  如果一個類包含了純虛函數,稱此類為抽象類 。
二、什么函數不能聲明為虛函數:
一個類中將所有的成員函數都盡可能地設置為虛函數總是有益的。
設置虛函數須注意:
1:只有類的成員函數才能說明為虛函數(C++不支持普通函數為虛函數);
2:靜態成員函數不能是虛函數;
3:內聯函數不能為虛函數;
4:構造函數不能是虛函數;
5:析構函數可以是虛函數,而且通常聲明為虛函數。
6:為什么C++不支持友元函數為虛函數 (因為C++不支持友元函數的繼承,對于沒有繼承特性的函數沒有虛函數的說法)。
類里面“定義”的成員函數是內聯的,但是仍然可以成為虛函數,那么是不是可以說“內聯函數不能成為虛函數”這句話有問題呢,是不是應該改成“顯式定義的內聯函數不能成為虛函數”。比如下面這個示例程序:
#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的.inline關鍵字只是對編譯器的一個建議:"如果有可能,請把此函數搞成inline的"








歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧美激情视频一区二区三区在线播放 | 免费午夜视频在线观看 | 九色国产| 亚洲综合久久网 | 麻豆视频国产在线观看 | 求个av网址 | 手机看片1| 91亚洲国产亚洲国产 | 国产美女免费视频 | 91国内视频在线 | 国产亚洲精品久久久久动 | 99视频在线免费观看 | a中文在线视频 | 成人在线一区二区 | 91秦先生艺校小琴 | 久久精品国产久精国产 | 欧美freesex黑人又粗又大 | 亚洲97| 久草网视频 | 成人一区二区在线 | 伊人婷婷 | 91在线视频网址 | 伦理午夜电影免费观看 | 国产精品一区二区福利视频 | 成人性视频免费网站 | 国产成人精品免费 | 亚洲国产成人精品女人久久久 | 中文字幕av亚洲精品一部二部 | 精品免费国产一区二区三区四区介绍 | 午夜爽爽爽男女免费观看 | 亚洲一区在线日韩在线深爱 | 天天影视网天天综合色在线播放 | 欧美成人精品一区二区男人看 | 欧美在线观看一区 | 欧美日韩亚洲一区 | 久久久国产一区二区三区 | 天天射天天干 | 日韩国产高清在线观看 | 国产精品国产精品国产专区不片 | 综合国产 | 99爱国产 |