真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么在c++中利用虛函數(shù)實(shí)現(xiàn)多態(tài)

今天就跟大家聊聊有關(guān)怎么在c++中利用虛函數(shù)實(shí)現(xiàn)多態(tài),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、成都網(wǎng)站制作、成都外貿(mào)網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的雁山網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!

#include
using namespace std;
class CFather 
{
public:
  virtual void AA()  //虛函數(shù)標(biāo)識(shí)符
  {
    cout << "CFather :: AA()" << endl;
  }
  void BB()
  {
    cout << "CFather :: BB()" << endl;
  }
};
class CSon : public CFather
{
public:
  void AA()
  {
    cout << "CSon :: AA()" << endl;
  }
  void BB()
  {
    cout << "CSon :: BB()" << endl;
  }
};
int main()
{
  cout << sizeof(CFather) << endl;         //測(cè)試加了虛函數(shù)的類

  system("pause");
  return 0;
}

怎么在c++中利用虛函數(shù)實(shí)現(xiàn)多態(tài)

很明顯類里裝了一個(gè) 4個(gè)字節(jié)的東西,除了整形int,就是指針了,沒錯(cuò)這里裝的就是函數(shù)指針

先把這個(gè)代碼,給抽象成圖形進(jìn)行理解,在這CFather為A,CSon為B

怎么在c++中利用虛函數(shù)實(shí)現(xiàn)多態(tài)

此時(shí)就是一個(gè)單純的繼承的情況,不存在虛函數(shù),然后我new一個(gè)對(duì)象,A *p = new A;那么 p -> AA(),必然是指向A類中的AA()函數(shù),那么函數(shù)的調(diào)用有兩種方式 一種函數(shù)名加()直接調(diào)用,一種是利用函數(shù)指針進(jìn)行調(diào)用,在這里我想要調(diào)用子類的,就可以利用函數(shù)指針進(jìn)行調(diào)用,假設(shè)出來(lái)兩個(gè)函數(shù)指針,來(lái)指向B類中的兩個(gè)成員函數(shù),如果我父類想要調(diào)用子類成員,就可以通過(guò) p指針去調(diào)用函數(shù)指針,再通過(guò)函數(shù)指針去調(diào)用成員函數(shù)

,怎么在c++中利用虛函數(shù)實(shí)現(xiàn)多態(tài)

每一個(gè)函數(shù)都可以用一個(gè)函數(shù)指針去指著,那么每一類中的函數(shù)指針都可以形成自己的一個(gè)表,這個(gè)就叫做虛函數(shù)表

怎么在c++中利用虛函數(shù)實(shí)現(xiàn)多態(tài)

那么在創(chuàng)建對(duì)象后,為什么類中會(huì)有四個(gè)字節(jié)的內(nèi)存空間呢?

在C++的標(biāo)準(zhǔn)規(guī)格說(shuō)明書中說(shuō)到,編譯器必需要保證虛函數(shù)表的指針存在于對(duì)象中最前面的位置(這是為了保證正確取到虛函數(shù)的偏移量)。這意味著我們通過(guò)對(duì)象實(shí)例的地址得到這張?zhí)摵瘮?shù)表,然后就可以遍歷其中函數(shù)指針,并調(diào)用相應(yīng)的函數(shù)。也就是說(shuō)這四個(gè)字節(jié)的指針,代替了上圖中(p->*pfn)()的作用,指向了函數(shù)指針,也就是說(shuō),在使用了虛函數(shù)的父類成員函數(shù),雖然寫的還是p->AA(),實(shí)際上卻是,(p->*(vfptr[0])),而指向哪個(gè)虛函數(shù)表就由,創(chuàng)建的對(duì)象來(lái)決定

怎么在c++中利用虛函數(shù)實(shí)現(xiàn)多態(tài)

至此,就能理解如何用虛函數(shù)這個(gè)機(jī)制來(lái)實(shí)現(xiàn)多態(tài)的了

下面,我將分別說(shuō)明“無(wú)覆蓋”和“有覆蓋”時(shí)的虛函數(shù)表的樣子。沒有覆蓋父類的虛函數(shù)是毫無(wú)意義的。我之所以要講述沒有覆蓋的情況,主要目的是為了給一個(gè)對(duì)比。在比較之下,我們可以更加清楚地知道其內(nèi)部的具體實(shí)現(xiàn)。

無(wú)虛數(shù)覆蓋

下面,再讓我們來(lái)看看繼承時(shí)的虛函數(shù)表是什么樣的。假設(shè)有如下所示的一個(gè)繼承關(guān)系:

怎么在c++中利用虛函數(shù)實(shí)現(xiàn)多態(tài)

請(qǐng)注意,在這個(gè)繼承關(guān)系中,子類沒有重載任何父類的函數(shù)。那么,在派生類的實(shí)例中,Derive d; 的虛函表:

怎么在c++中利用虛函數(shù)實(shí)現(xiàn)多態(tài)

我們可以看到下面幾點(diǎn):

1)虛函數(shù)按照其聲明順序放于表中。

2)父類的虛函數(shù)在子類的虛函數(shù)前面。

有虛數(shù)覆蓋

覆蓋父類的虛函數(shù)是很顯然的事情,不然,虛函數(shù)就變得毫無(wú)意義。下面,我們來(lái)看一下,如果子類中有虛函數(shù)重載了父類的虛函數(shù),會(huì)是一個(gè)什么樣子?假設(shè),我們有下面這樣的一個(gè)繼承關(guān)系。

怎么在c++中利用虛函數(shù)實(shí)現(xiàn)多態(tài)

為了讓大家看到被繼承過(guò)后的效果,在這個(gè)類的設(shè)計(jì)中,我只覆蓋了父類的一個(gè)函數(shù):f()。那么,對(duì)于派生類的實(shí)例,其虛函數(shù)表會(huì)是下面的一個(gè)樣子:

怎么在c++中利用虛函數(shù)實(shí)現(xiàn)多態(tài)

我們從表中可以看到下面幾點(diǎn),

1)覆蓋的f()函數(shù)被放到了虛表中原來(lái)父類虛函數(shù)的位置。

2)沒有被覆蓋的函數(shù)依舊。

這樣,我們就可以看到對(duì)于下面這樣的程序,

Base *b = new Derive();

b->f();

看完上述內(nèi)容,你們對(duì)怎么在c++中利用虛函數(shù)實(shí)現(xiàn)多態(tài)有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。


文章標(biāo)題:怎么在c++中利用虛函數(shù)實(shí)現(xiàn)多態(tài)
本文鏈接:http://weahome.cn/article/jiisoi.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部