最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳細(xì)分析C++ 多態(tài)和虛函數(shù)

 更新時間:2020年07月08日 15:21:15   作者:菜鳥教程  
這篇文章主要介紹了C++ 多態(tài)和虛函數(shù)的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

多態(tài)按字面的意思就是多種形態(tài)。當(dāng)類之間存在層次結(jié)構(gòu),并且類之間是通過繼承關(guān)聯(lián)時,就會用到多態(tài)。

C++ 多態(tài)意味著調(diào)用成員函數(shù)時,會根據(jù)調(diào)用函數(shù)的對象的類型來執(zhí)行不同的函數(shù)。

下面的實(shí)例中,基類 Shape 被派生為兩個類,如下所示:

#include <iostream> 
using namespace std;
 
class Shape {
  protected:
   int width, height;
  public:
   Shape( int a=0, int b=0)
   {
     width = a;
     height = b;
   }
   int area()
   {
     cout << "Parent class area :" <<endl;
     return 0;
   }
};
class Rectangle: public Shape{
  public:
   Rectangle( int a=0, int b=0):Shape(a, b) { }
   int area ()
   { 
     cout << "Rectangle class area :" <<endl;
     return (width * height); 
   }
};
class Triangle: public Shape{
  public:
   Triangle( int a=0, int b=0):Shape(a, b) { }
   int area ()
   { 
     cout << "Triangle class area :" <<endl;
     return (width * height / 2); 
   }
};
// 程序的主函數(shù)
int main( )
{
  Shape *shape;
  Rectangle rec(10,7);
  Triangle tri(10,5);
 
  // 存儲矩形的地址
  shape = &rec;
  // 調(diào)用矩形的求面積函數(shù) area
  shape->area();
 
  // 存儲三角形的地址
  shape = &tri;
  // 調(diào)用三角形的求面積函數(shù) area
  shape->area();
  
  return 0;
}

當(dāng)上面的代碼被編譯和執(zhí)行時,它會產(chǎn)生下列結(jié)果:

Parent class area
Parent class area

導(dǎo)致錯誤輸出的原因是,調(diào)用函數(shù) area() 被編譯器設(shè)置為基類中的版本,這就是所謂的靜態(tài)多態(tài),或靜態(tài)鏈接 - 函數(shù)調(diào)用在程序執(zhí)行前就準(zhǔn)備好了。有時候這也被稱為早綁定,因?yàn)?area() 函數(shù)在程序編譯期間就已經(jīng)設(shè)置好了。

但現(xiàn)在,讓我們對程序稍作修改,在 Shape 類中,area() 的聲明前放置關(guān)鍵字 virtual,如下所示:

class Shape {
  protected:
   int width, height;
  public:
   Shape( int a=0, int b=0)
   {
     width = a;
     height = b;
   }
   virtual int area()
   {
     cout << "Parent class area :" <<endl;
     return 0;
   }
};

修改后,當(dāng)編譯和執(zhí)行前面的實(shí)例代碼時,它會產(chǎn)生以下結(jié)果:

Rectangle class area
Triangle class area

此時,編譯器看的是指針的內(nèi)容,而不是它的類型。因此,由于 tri 和 rec 類的對象的地址存儲在 *shape 中,所以會調(diào)用各自的 area() 函數(shù)。

正如您所看到的,每個子類都有一個函數(shù) area() 的獨(dú)立實(shí)現(xiàn)。這就是多態(tài)的一般使用方式。有了多態(tài),您可以有多個不同的類,都帶有同一個名稱但具有不同實(shí)現(xiàn)的函數(shù),函數(shù)的參數(shù)甚至可以是相同的。

虛函數(shù)

虛函數(shù) 是在基類中使用關(guān)鍵字 virtual 聲明的函數(shù)。在派生類中重新定義基類中定義的虛函數(shù)時,會告訴編譯器不要靜態(tài)鏈接到該函數(shù)。

我們想要的是在程序中任意點(diǎn)可以根據(jù)所調(diào)用的對象類型來選擇調(diào)用的函數(shù),這種操作被稱為動態(tài)鏈接,或后期綁定。

純虛函數(shù)

您可能想要在基類中定義虛函數(shù),以便在派生類中重新定義該函數(shù)更好地適用于對象,但是您在基類中又不能對虛函數(shù)給出有意義的實(shí)現(xiàn),這個時候就會用到純虛函數(shù)。

我們可以把基類中的虛函數(shù) area() 改寫如下:

class Shape {
  protected:
   int width, height;
  public:
   Shape( int a=0, int b=0)
   {
     width = a;
     height = b;
   }
   // pure virtual function
   virtual int area() = 0;
};

= 0 告訴編譯器,函數(shù)沒有主體,上面的虛函數(shù)是純虛函數(shù)。

以上就是詳細(xì)分析C++ 多態(tài)和虛函數(shù)的詳細(xì)內(nèi)容,更多關(guān)于C++ 多態(tài)和虛函數(shù)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言數(shù)據(jù)結(jié)構(gòu)之Hash散列表

    C語言數(shù)據(jù)結(jié)構(gòu)之Hash散列表

    這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之Hash散列表,散列表(哈希表)其思想主要是基于數(shù)組支持按照下標(biāo)隨機(jī)訪問數(shù)據(jù),時間復(fù)雜度為O(1)的特性,可以說是數(shù)組的一種拓展,需要的朋友可以參考下
    2023-08-08
  • opencv實(shí)現(xiàn)圖像傾斜校正

    opencv實(shí)現(xiàn)圖像傾斜校正

    這篇文章主要為大家詳細(xì)介紹了opencv實(shí)現(xiàn)圖像傾斜校正,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-07-07
  • C語言用循環(huán)單鏈表實(shí)現(xiàn)約瑟夫環(huán)

    C語言用循環(huán)單鏈表實(shí)現(xiàn)約瑟夫環(huán)

    這篇文章主要為大家詳細(xì)介紹了C語言用循環(huán)單鏈表實(shí)現(xiàn)約瑟夫環(huán),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Windows下sentry接入C/C++程序的詳細(xì)過程

    Windows下sentry接入C/C++程序的詳細(xì)過程

    sentry作為一個開源的軟件,發(fā)展至今,已經(jīng)非常成熟。它支持的平臺眾多,甚至于針對不同的工作者(后臺、前端、客戶端)都有相應(yīng)的內(nèi)容,這篇文章主要介紹了Windows下sentry接入C/C++程序,需要的朋友可以參考下
    2022-09-09
  • linux下access函數(shù)的用法介紹

    linux下access函數(shù)的用法介紹

    access檢查用戶對一個文件的權(quán)限情況,根據(jù)mode的值檢查調(diào)用進(jìn)程對文件pathname是否具有讀、寫、或執(zhí)行的權(quán)限
    2013-08-08
  • C++中關(guān)于union的使用方法說明

    C++中關(guān)于union的使用方法說明

    這篇文章主要介紹了C++中關(guān)于union的使用方法說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C語言內(nèi)存分布與heap空間分別詳細(xì)講解

    C語言內(nèi)存分布與heap空間分別詳細(xì)講解

    一個程序本質(zhì)上都是由 BSS 段、data段、text段三個組成的。這種概念在當(dāng)前的計算機(jī)程序設(shè)計中是非常重要的一個基本概念,并且在嵌入式系統(tǒng)的設(shè)計中也非常重要,牽涉到嵌入式系統(tǒng)執(zhí)行時的內(nèi)存大小分配,存儲單元占用空間大小的問題
    2022-11-11
  • 使用c語言輸出楊輝三角形的簡單方法

    使用c語言輸出楊輝三角形的簡單方法

    這篇文章主要給大家介紹了關(guān)于如何使用c語言輸出楊輝三角形的簡單方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C++實(shí)現(xiàn)LeetCode(199.二叉樹的右側(cè)視圖)

    C++實(shí)現(xiàn)LeetCode(199.二叉樹的右側(cè)視圖)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(199.二叉樹的右側(cè)視圖),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • C/C++ 中g(shù)cc和g++的對比與區(qū)別

    C/C++ 中g(shù)cc和g++的對比與區(qū)別

    這篇文章主要介紹了C/C++ 中g(shù)cc和g++的對比與區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2017-07-07

最新評論

银川市| 彭阳县| 苏尼特右旗| 云浮市| 如皋市| 鹤山市| 六盘水市| 三原县| 突泉县| 绥中县| 介休市| 中江县| 达日县| 五台县| 常宁市| 本溪| 双鸭山市| 龙陵县| 如东县| 湖口县| 湾仔区| 莱阳市| 司法| 望江县| 吉安县| 来宾市| 永兴县| 宜良县| 文化| 个旧市| 新化县| 农安县| 阳春市| 文水县| 温宿县| 安吉县| 本溪| 静乐县| 武威市| 宽甸| 萍乡市|