多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

中國最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2

cpp教程

C++ 多態

閱讀 (2350)

C++ 多態

多態按字面的意思就是多種形態。當類之間存在層次結構,并且類之間是通過繼承關聯時,就會用到多態。

C++ 多態意味著調用成員函數時,會根據調用函數的對象的類型來執行不同的函數。

下面的實例中,基類 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); 
      }
};
// 程序的主函數
int main( )
{
   Shape *shape;
   Rectangle rec(10,7);
   Triangle  tri(10,5);

   // 存儲矩形的地址
   shape = &rec;
   // 調用矩形的求面積函數 area
   shape->area();

   // 存儲三角形的地址
   shape = &tri;
   // 調用三角形的求面積函數 area
   shape->area();
   
   return 0;
}

當上面的代碼被編譯和執行時,它會產生下列結果:

Parent class area
Parent class area

導致錯誤輸出的原因是,調用函數 area() 被編譯器設置為基類中的版本,這就是所謂的靜態多態,或靜態鏈接 - 函數調用在程序執行前就準備好了。有時候這也被稱為早綁定,因為 area() 函數在程序編譯期間就已經設置好了。

但現在,讓我們對程序稍作修改,在 Shape 類中,area() 的聲明前放置關鍵字 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;
      }
};

修改后,當編譯和執行前面的實例代碼時,它會產生以下結果:

Rectangle class area
Triangle class area

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

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

虛函數

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

我們想要的是在程序中任意點可以根據所調用的對象類型來選擇調用的函數,這種操作被稱為動態鏈接,或后期綁定

純虛函數

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

我們可以把基類中的虛函數 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 告訴編譯器,函數沒有主體,上面的虛函數是純虛函數

關閉
程序員人生
主站蜘蛛池模板: 国产成人精品免费视频大全办公室 | 亚洲天堂久久精品成人 | 欧美午夜在线 | 午夜影院免费版 | 亚洲天堂在线视频播放 | 麻豆影视免费观看 | 久久精品亚洲综合 | 日本无卡码一区二区三区 | 精品国产亚洲一区二区三区 | 花蝴蝶亚洲一区二区三区 | 日本在线不卡免费视频一区 | 欧美一级毛片欧美大尺度一级毛片 | 亚州va| 中国漂亮护士一级毛片 | 大色欧美 | 手机在线视频观看 | 国产最新一区二区三区天堂 | 国产欧美日韩综合在线一 | 午夜久久久久久亚洲国产精品 | 在线播放免费一级毛片欧美 | 成人av播放 | 国产a国产片色老头 | 国产成人短视频在线观看免费 | 手机在线一区二区三区 | 亚洲激情视频在线播放 | 免费播放观看在线视频 | 性欧美另类老妇高清 | 亚洲狠狠| 欧美两性人xxxx高清免费 | 国产欧美二区三区 | 国产成人欧美 | 一级特黄aa大片一又好看 | 东方aⅴ免费观看久久av | 久久欧美精品欧美久久欧美 | 午夜在线观看免费观看大全 | 中文字幕日韩精品中文区 | 91久久精品国产免费一区 | 日本噜噜影院 | 77777亚洲午夜久久多人 | 亚洲在线成人 | 最近中文字幕高清mv免费 |