亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

深入理解c++中virtual關鍵字

2020-01-26 15:36:10
字體:
來源:轉載
供稿:網友

1.virtual關鍵字主要是什么作用?
c++中的函數調用默認不適用動態綁定。要觸發動態綁定,必須滿足兩個條件:第一,指定為虛函數;第二,通過基類類型的引用或指針調用。
由此可見,virtual主要主要是實現動態綁定。

2.那些情況下可以使用virtual關鍵字?
virtual可用來定義類函數和應用到虛繼承。

友元函數 構造函數 static靜態函數 不能用virtual關鍵字修飾;
普通成員函數 和析構函數 可以用virtual關鍵字修飾;

3.virtual函數的效果

復制代碼 代碼如下:

class GrandFather
{
public:
 GrandFather() {}
 virtual void fun()
 {
  cout << "GrandFather call function!" << endl;
 }
};

class Father : public GrandFather
{
public:
  Father() {}
  void fun()
  {
   cout << "Father call function!" << endl;
  }
};


class Son : public Father
{
public:
 Son() {}
 void fun()
 {
  cout << "Son call function!" << endl;
 }
};

void print(GrandFather* father)
{
 father->fun();
}

int _tmain(int argc, _TCHAR* argv[])
{
 Father * pfather = new Son;
        pfather->fun();
        GrandFather * pgfather = new Father;
        print(pgfather);
 return 0;
}


輸出為 Son call function
       Father call function

4.virtual的繼承性
只要基函數定義了virtual,繼承類的該函數也就具有virtual屬性
即 GrandFather Father Son同時定義virtual void fun()與GrandFather一個定義virtual void fun效果是一樣的

5.虛析構函數

復制代碼 代碼如下:

class GrandFather
{
public:
 GrandFather() {}
 virtual void fun()
 {
  cout << "GrandFather call function!" << endl;
 }

 ~GrandFather()
 {
  cout << "GrandFather destruction!" << endl;
 }
};

class Father : public GrandFather
{
public:
 Father() {}
 void fun()
 {
  cout << "Father call function!" << endl;
 }

 ~Father()
 {
  cout << "Father destruction!" << endl;
 }
};


class Son : public Father
{
public:
 Son() {}
 void fun()
 {
  cout << "Son call function!" << endl;
 }

  ~Son()
 {
  cout << "Son destruction!" << endl;
 }
};

void print(GrandFather* p)
{
 p->fun();
}

int _tmain(int argc, _TCHAR* argv[])
{
 Father * pfather = new Son;
 delete pfather;
 return 0;
}


以上代碼輸出:Father destruction!
                             GrandFather destruction!
執行了Son的構造函數,沒執行Son的析構函數,故把GrandFather的析構函數設置為virtual
則輸出: Son destruction!
        Father Destruction!
        GrandFather destruction!

6. 純虛函數
純虛函數定義如下:

復制代碼 代碼如下:

class GrandFather
{
public:
 GrandFather() {}
 virtual void fun() = 0
 {
  cout << "GrandFather call function!" << endl;
 }

 virtual ~GrandFather()
 {
  cout << "GrandFather destruction!" << endl;
 }
};


純虛函數為后代類提供可覆蓋的接口,但這個類中的版本決不會調用。
含有(或繼續)一個或多個純虛函數的類是抽象基類,抽象基類不能實例化!
繼承類只有重寫這個接口才能被實例化


7.虛繼承
虛繼承主要解決交叉繼承帶來的問題。這里給出一片參考文章c++虛繼承。
給一個例子如下

復制代碼 代碼如下:

class GrandFather
{
public:
 GrandFather() {}
 void fun()
 {
  cout << "GrandFather call function!" << endl;
 }

 virtual ~GrandFather()
 {
  cout << "GrandFather destruction!" << endl;
 }
};

class Father1 : public GrandFather
{
public:
 Father1() {}
 void fun()
 {
  cout << "Father call function!" << endl;
 }

};

class Father2 : public GrandFather
{
public:
 Father2() {}
 void fun()
 {
  cout << "Father call function!" << endl;
 }

};


class Son : public Father1, public Father2
{
public:
 Son() {}
 //void fun()
 //{
 // cout << "Son call function!" << endl;
 //}
};

void print(GrandFather* p)
{
 p->fun();
}

int _tmain(int argc, _TCHAR* argv[])
{
 Son* son = new Son;
 son->fun();
 return 0;
}


編譯時會提示報錯對fun的訪問不明確
如果Father1和Father2都用虛繼承繼承GrandFather類則可以解決這個問題

8. 構造函數和析構函數中的虛函數
如果在構造函數或析構函數中調用虛函數,則運行的是為構造函數或析構函數自身類型定義的版本


9.虛函數的實現機制
關于虛函數的實現機制,我們以后在介紹。

10.小結
關于virtual關鍵字的用法總結如上,有錯誤或者總結不到位的情況請能幫本人指出!

11.例子

復制代碼 代碼如下:

class classA
{
 public:
 classA()
 {
  clear();
 }
 virtual ~classA()
 {
 }
 void clear()
 {
  memset(this , 0 , sizeof(*this));
 }
 virtual void func()
 {
  printf("func/n");
 }
};

class classB : public classA
{
};

int main(void)
{
 classA oa;
 classB ob;
 classA * pa0 = &oa;
 classA * pa1 = &ob;
 classB * pb = &ob;
 oa.func(); // 1
 ob.func(); // 2
 pa0->func(); // 3
 pa1->func(); // 4
 pb->func(); // 5
 return 0;
}


補充一個例子,這個程序輸出依次是
func
func
出錯
func
func

談談我的理解,當
classA oa;
oa.func();
不存在動態調用的過程,所以func雖然是虛函數,但是函數調用不通過虛表訪問,所以即使

復制代碼 代碼如下:

memset(this , 0 , sizeof(*this));

找不到虛表地址也沒有關系
在執行classB ob;的時候,注意memset的是classA的地址,所有ob的虛表是存在的
即是如下,通過指針或引用(動態綁定)訪問oa的func函數(需要從虛表訪問),會出錯
訪問ob的func和函數,無論靜態訪問還是動態訪問,都不會出錯


當把classB的代碼改成如下時

復制代碼 代碼如下:

class classB : public classA

<PRE style="FONT-WEIGHT: bold" class=cpp name="code">{</PRE><PRE style="FONT-WEIGHT: bold" class=cpp name="code">        classB()
 {
  clear();
 }
 virtual ~classB()
 {
 }
 void clear()
 {
     memset(this , 0 , sizeof(*this));
 }</PRE><BR>
<PRE></PRE>
<PRE style="FONT-WEIGHT: bold" class=cpp name="code">};</PRE>輸出為


func
func
出錯
出錯
出錯

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线电影中文日韩| 欧美—级高清免费播放| 亚洲国产女人aaa毛片在线| 日本aⅴ大伊香蕉精品视频| 国产精品入口日韩视频大尺度| 一区二区三区www| 伊人久久精品视频| 91麻豆国产精品| 91精品国产色综合久久不卡98口| 亚洲国产成人爱av在线播放| 成年人精品视频| 欧美一级片久久久久久久| 日韩在线视频观看| 性夜试看影院91社区| 日韩亚洲欧美成人| 中文字幕在线国产精品| 九九久久久久99精品| 国产欧美日韩精品丝袜高跟鞋| 97精品国产97久久久久久春色| 91嫩草在线视频| 欧美亚洲国产精品| 一区二区在线免费视频| 欧美激情亚洲视频| 亚洲图中文字幕| 91在线视频精品| 亚洲国产女人aaa毛片在线| 欧美激情第99页| 亚洲网站在线播放| 亚洲国内精品视频| 精品久久在线播放| 亚洲片av在线| 欧美国产日韩在线| 国产欧美精品日韩| 久久精品这里热有精品| 97视频在线观看免费高清完整版在线观看| 最新国产精品亚洲| 亚洲精品色婷婷福利天堂| 欧美成人黄色小视频| 国产成人精品电影久久久| 国产激情综合五月久久| 欧美国产激情18| 亚洲人成啪啪网站| 亚洲xxxxx电影| 亚洲国产成人精品电影| 日本欧美在线视频| 国产精品99久久久久久www| 欧美国产亚洲视频| 中文字幕精品视频| 国产精选久久久久久| 国产精品白丝jk喷水视频一区| 91日韩在线视频| 欧美日韩美女在线| 欧美三级xxx| 亚洲欧美在线x视频| 国产精品女人久久久久久| 亚洲日本aⅴ片在线观看香蕉| 88国产精品欧美一区二区三区| 欧美在线xxx| 中文字幕日韩免费视频| 亚洲精品福利视频| 中文字幕亚洲二区| 国产精品丝袜久久久久久高清| 中文字幕最新精品| 日韩久久免费视频| 亚洲自拍偷拍在线| 懂色av一区二区三区| 日韩精品一区二区三区第95| 日韩美女福利视频| 国产精品丝袜久久久久久不卡| 国产在线精品一区免费香蕉| 中文字幕日韩有码| 国产日韩av在线| 黑人巨大精品欧美一区二区三区| 福利视频导航一区| 亚洲乱码国产乱码精品精| 亚洲欧美精品一区二区| 亚洲精品丝袜日韩| 色噜噜狠狠狠综合曰曰曰88av| 亚洲精品美女视频| 91夜夜未满十八勿入爽爽影院| 国产大片精品免费永久看nba| 亚洲嫩模很污视频| 久久久久一本一区二区青青蜜月| 亚洲国产精品99久久| 亚洲精品在线观看www| 成人精品久久久| 国产在线视频一区| 亚洲女人被黑人巨大进入al| 国产mv久久久| www.日韩视频| 91午夜在线播放| 国产欧美日韩最新| 高潮白浆女日韩av免费看| 日本精品久久中文字幕佐佐木| 亚洲a区在线视频| 日韩综合视频在线观看| 国产午夜精品免费一区二区三区| 亚洲白拍色综合图区| 国产成人久久久| 国产精品96久久久久久| 欧美成人黄色小视频| 日韩亚洲第一页| 亚洲亚裔videos黑人hd| 在线观看欧美视频| 亚洲男人天堂2019| 91九色综合久久| 国产精品网址在线| 日韩hd视频在线观看| 国产精品美乳在线观看| 日韩av电影免费观看高清| 精品毛片三在线观看| 国产精品久久久一区| 伊人久久久久久久久久久久久| 久久久成人的性感天堂| 欧美在线不卡区| 91精品视频网站| 国产欧美精品日韩精品| 国产欧美精品久久久| 91精品国产高清久久久久久91| 亚洲精品久久久久久久久久久| 国产精品爱啪在线线免费观看| 九九热这里只有精品免费看| 欧美精品第一页在线播放| 欧美性xxxxxx| 国产亚洲一区精品| 91国内揄拍国内精品对白| 久久影视三级福利片| 欧美在线视频观看免费网站| 久久久精品2019中文字幕神马| 亚洲一区二区三区成人在线视频精品| 一区二区三区无码高清视频| 欧美猛交ⅹxxx乱大交视频| 国产在线观看91精品一区| 日本一区二三区好的精华液| 97在线视频免费| 91精品国产综合久久久久久久久| 日韩在线观看免费全集电视剧网站| 欧美成人三级视频网站| 欧美国产精品va在线观看| 日韩亚洲欧美成人| 色狠狠久久aa北条麻妃| 97久久伊人激情网| 国产精品视频男人的天堂| 欧美成人在线免费| 亚洲精品免费网站| 亚洲国模精品一区| 久久视频在线观看免费| 亚洲一级免费视频| 久久九九国产精品怡红院| 伊是香蕉大人久久| 91精品在线观看视频| 欧美亚洲另类视频| 国产精品扒开腿做爽爽爽视频| 亚洲欧美资源在线| 奇米4444一区二区三区| 亚洲欧美在线看| 91精品成人久久| 欧美激情欧美激情| 日韩av影片在线观看| 亚洲精品成人久久电影| 欧美成人亚洲成人日韩成人| 欧美大学生性色视频| 97国产精品久久| 欧美精品情趣视频|