亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時(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)時(shí),就會(huì)用到多態(tài)。

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

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

#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);
 
  // 存儲(chǔ)矩形的地址
  shape = &rec;
  // 調(diào)用矩形的求面積函數(shù) area
  shape->area();
 
  // 存儲(chǔ)三角形的地址
  shape = &tri;
  // 調(diào)用三角形的求面積函數(shù) area
  shape->area();
  
  return 0;
}

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

Parent class area
Parent class area

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

但現(xiàn)在,讓我們對(duì)程序稍作修改,在 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í)例代碼時(shí),它會(huì)產(chǎn)生以下結(jié)果:

Rectangle class area
Triangle class area

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

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

虛函數(shù)

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

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

純虛函數(shù)

您可能想要在基類中定義虛函數(shù),以便在派生類中重新定義該函數(shù)更好地適用于對(duì)象,但是您在基類中又不能對(duì)虛函數(shù)給出有意義的實(shí)現(xiàn),這個(gè)時(shí)候就會(huì)用到純虛函數(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ù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C語言實(shí)現(xiàn)堆排序的簡(jiǎn)單實(shí)例

    C語言實(shí)現(xiàn)堆排序的簡(jiǎn)單實(shí)例

    這篇文章主要介紹了C語言實(shí)現(xiàn)堆排序的簡(jiǎn)單實(shí)例,講述了堆排序的原理,需要的朋友可以參考下
    2014-07-07
  • 淺析C語言中堆和棧的區(qū)別

    淺析C語言中堆和棧的區(qū)別

    堆和棧都是一種數(shù)據(jù)項(xiàng)按序排列的數(shù)據(jù)結(jié)構(gòu)。在C語言中是非常重要的知識(shí)點(diǎn),接下來通過本文給大家介紹C語言中堆和棧的區(qū)別,感興趣的朋友一起看下吧
    2016-06-06
  • C/C++ 獲取自身IP與域名片段的示例代碼

    C/C++ 獲取自身IP與域名片段的示例代碼

    這篇文章主要介紹了C/C++ 獲取自身IP與域名片段的示例代碼,幫助大家更好的理解和學(xué)習(xí)C/C++編程,感興趣的朋友可以了解下
    2020-10-10
  • c++中vector<int>和vector<int*>的用法及區(qū)別

    c++中vector<int>和vector<int*>的用法及區(qū)別

    這篇文章主要介紹了c++中vector<int>和vector<int*>的用法及區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2013-10-10
  • 淺析C語言調(diào)試器GDB和LLDB的使用方法

    淺析C語言調(diào)試器GDB和LLDB的使用方法

    這篇文章主要介紹了C語言調(diào)試器GDB和LLDB的使用方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-12-12
  • c++核心編程之函數(shù)的重載

    c++核心編程之函數(shù)的重載

    這篇文章主要介紹了c++核心編程之函數(shù)的重載,函數(shù)可以重復(fù)使用,提高了復(fù)用性,但前提是必須在一個(gè)作用域并且函數(shù)名稱相同,下面附代碼詳細(xì)介紹,需要的小伙伴可以參考一下
    2022-03-03
  • C++之關(guān)于string對(duì)象的大小比較

    C++之關(guān)于string對(duì)象的大小比較

    這篇文章主要介紹了C++之關(guān)于string對(duì)象的大小比較方式,具有很好的 參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • 詳解c++中的trait與policy模板技術(shù)

    詳解c++中的trait與policy模板技術(shù)

    trait模板和policy模板技術(shù)是把模板的trait和policy這兩個(gè)針對(duì)不同具體類型有變化的方面抽離出來形成兩個(gè)獨(dú)立的模板。由于trait和policy本身是模板,它的行為是可配置的,在模板中通過組合或者以模板實(shí)參傳進(jìn)來的方式使用trait和policy,就可以配置出不同的具體實(shí)現(xiàn)
    2021-06-06
  • QT基于TCP實(shí)現(xiàn)網(wǎng)絡(luò)聊天室程序

    QT基于TCP實(shí)現(xiàn)網(wǎng)絡(luò)聊天室程序

    這篇文章主要為大家詳細(xì)介紹了QT基于TCP實(shí)現(xiàn)網(wǎng)絡(luò)聊天室程序,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • 基于C++實(shí)現(xiàn)kinect+opencv 獲取深度及彩色數(shù)據(jù)

    基于C++實(shí)現(xiàn)kinect+opencv 獲取深度及彩色數(shù)據(jù)

    本文的主要思想是Kinect SDK 讀取彩色、深度、骨骼信息并用OpenCV顯示,非常的實(shí)用,有需要的小伙伴可以參考下
    2015-12-12

最新評(píng)論