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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2111|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

C++不能聲明為虛函數(shù)的函數(shù)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:108615 發(fā)表于 2016-3-13 16:59 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
一、首先回顧下什么是虛函數(shù)及其作用,以便更好理解什么函數(shù)不能聲明或定義為虛函數(shù)
1. 定義:
虛函數(shù)必須是基類的非靜態(tài)成員函數(shù),其訪問權(quán)限可以是protected或public,在基類的類定義中定義虛函數(shù)的一般形式:
  virtual 函數(shù)返回值類型 虛函數(shù)名(形參表)  { 函數(shù)體 }
2. 作用:
虛函數(shù)的作用是實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編,也就是在程序的運(yùn)行階段動(dòng)態(tài)地選擇合適的成員函數(shù),在定義了虛函數(shù)后,可以在基類的派生類中對(duì)虛函數(shù)重新定義,在派生類中重新定義的函數(shù)應(yīng)與虛函數(shù)具有相同的形參個(gè)數(shù)和形參類型,以實(shí)現(xiàn)統(tǒng)一的接口,不同定義過程。如果在派生類中沒有對(duì)虛函數(shù)重新定義,則它繼承其基類的虛函數(shù)。
當(dāng)程序發(fā)現(xiàn)虛函數(shù)名前的關(guān)鍵字virtual后,會(huì)自動(dòng)將其作為動(dòng)態(tài)聯(lián)編處理,即在程序運(yùn)行時(shí)動(dòng)態(tài)地選擇合適的成員函數(shù)。
3. 使用方法:
動(dòng)態(tài)聯(lián)編規(guī)定,只能通過指向基類的指針或基類對(duì)象的引用來調(diào)用虛函數(shù),其格式:
  指向基類的指針變量名->虛函數(shù)名(實(shí)參表)
      基類對(duì)象的引用名. 虛函數(shù)名(實(shí)參表)
4. 其它說明:  
虛函數(shù)是C++多態(tài)的一種表現(xiàn):
例如:子類繼承了父類的一個(gè)函數(shù)(方法),而我們把父類的指針指向子類,則必須把父類的該函數(shù)(方法)設(shè)為virtual(虛函數(shù))。  使用虛函數(shù),我們可以靈活的進(jìn)行動(dòng)態(tài)綁定,當(dāng)然是以一定的開銷為代價(jià)。 如果父類的函數(shù)(方法)根本沒有必要或者無法實(shí)現(xiàn),完全要依賴子類去實(shí)現(xiàn)的話,可以把此函數(shù)(方法)設(shè)為virtual 函數(shù)名=0 我們把這樣的函數(shù)(方法)稱為純虛函數(shù)。  如果一個(gè)類包含了純虛函數(shù),稱此類為抽象類 。
二、什么函數(shù)不能聲明為虛函數(shù):
一個(gè)類中將所有的成員函數(shù)都盡可能地設(shè)置為虛函數(shù)總是有益的。
設(shè)置虛函數(shù)須注意:
1:只有類的成員函數(shù)才能說明為虛函數(shù)(C++不支持普通函數(shù)為虛函數(shù));
2:靜態(tài)成員函數(shù)不能是虛函數(shù);
3:內(nèi)聯(lián)函數(shù)不能為虛函數(shù);
4:構(gòu)造函數(shù)不能是虛函數(shù);
5:析構(gòu)函數(shù)可以是虛函數(shù),而且通常聲明為虛函數(shù)。
6:為什么C++不支持友元函數(shù)為虛函數(shù) (因?yàn)镃++不支持友元函數(shù)的繼承,對(duì)于沒有繼承特性的函數(shù)沒有虛函數(shù)的說法)。
類里面“定義”的成員函數(shù)是內(nèi)聯(lián)的,但是仍然可以成為虛函數(shù),那么是不是可以說“內(nèi)聯(lián)函數(shù)不能成為虛函數(shù)”這句話有問題呢,是不是應(yīng)該改成“顯式定義的內(nèi)聯(lián)函數(shù)不能成為虛函數(shù)”。比如下面這個(gè)示例程序:
#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

你可以發(fā)現(xiàn),雖然f1在基類中定義的,按理說應(yīng)該是內(nèi)聯(lián)函數(shù),但是它仍然可以成為虛函
數(shù)。
類中定義的成員函數(shù)(函數(shù)體在類中)能成為虛函數(shù),大部分編譯器能夠?qū)㈦m然聲明為inline但實(shí)際上不能inline的函數(shù)自動(dòng)改為不inline的。至于編譯器會(huì)不會(huì)將inline   and   virtual的函數(shù)照模照樣的實(shí)現(xiàn),與編譯器及優(yōu)化方式有關(guān)。
要想成為虛函數(shù),必須能夠被取到地址.內(nèi)聯(lián)函數(shù)不能被取到地址所以不能成為虛函數(shù).

你寫inline   virtual   void   f(),不能保證函數(shù)f()一定是內(nèi)聯(lián)的,只能保證f()是虛函數(shù)(從而保證此函數(shù)一定不是內(nèi)聯(lián)函數(shù))

對(duì)于問題:
到底內(nèi)聯(lián)函數(shù)能不能成為虛函數(shù)?
答案是不能.問題是你不能夠確定一個(gè)函數(shù)到底是不是inline的.inline關(guān)鍵字只是對(duì)編譯器的一個(gè)建議:"如果有可能,請(qǐng)把此函數(shù)搞成inline的"



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 四虎影视在线播放 | 一级黄色片网站 | 欧洲精品一区二区 | 欧美日韩一区在线 | 手机av在线播放 | 日韩伦理一区二区 | 久久午夜影院 | 蜜臀久久99精品久久久久久宅男 | 久久久精品国产sm调教网站 | 免费黄网站在线观看 | 一级特黄aaaaaa大片 | 白浆在线| 国产人人干| 天堂资源 | 亚洲激情一区 | 欧美午夜精品久久久久免费视 | 黄色一级大片在线免费看产 | 国产三级黄色 | 欧美激情综合五月色丁香 | www欧美| 天天干女人 | 黄色片免费在线观看 | 日韩免费高清视频 | 中文字幕第7页 | 亚洲一区在线看 | 免费视频一区 | 99九九久久 | 免费一级黄色片 | 亚洲成人a v| 亚洲综合自拍 | 欧美在线视频观看 | 国产aⅴ爽av久久久久成人 | 韩国精品一区 | 国产色站 | 国产精品黄色 | 中文在线视频 | 国产在线观看一区 | 日韩精品在线观看视频 | 国产成人一区二区 | 黄色大片一级 | 一级片在线视频 |