細談C++多態性的“動”與“靜”

發表于:2008-06-10來源:作者:點擊數: 標簽:多態
關鍵字:C++ “動”與“靜” 在我們討論多態的時候,先看看什么是硬編碼和軟編碼:硬編碼就是把代碼寫死了,導致彈性不足,降低了可擴展性,例如在代碼里的: if...else...;switch...case... 這些代碼通常都屬于硬編碼,項目中的這些代碼多了,就相當于說明
關鍵字:C++ “動”與“靜”

 在我們討論多態的時候,先看看什么是硬編碼和軟編碼:硬編碼就是把代碼寫死了,導致彈性不足,降低了可擴展性,例如在代碼里的: if...else...;switch...case...
  
  這些代碼通常都屬于硬編碼,項目中的這些代碼多了,就相當于說明這個代碼的靈活性、擴展性、彈性等等的少了。

  所以,我們要盡量使用軟編碼,通俗點就是“別把話說死了,留點轉彎的余地”。多態性就是這種軟編碼特性的反映,下面我們一起來研究一下多態性。

  多態性是一種抽象,把事物的特征抽象出來,然后事物的具體形態我們就不關心了。

  例如對工人這種事物來說,他的特征就是工作,至于是什么工人,他做什么工作,我們就不用關心了,只要我們以“工人.工作”這種方式去調用。那他就會為我們工作了。

  那為什么我們不抽象出其他的特征,只抽象出工作這個特征呢?因為我們只對這個特征感興趣,他的什么吃飯、睡覺、如廁等的特性我們都不關心了。有了多態,我們就可以實現軟編碼了!

  講解了多態的概念之后,我們來看看多態的實現(C++的實現):

  多態的實現是通過虛函數表(VTable),每個類如果有虛函數,那它就有一個虛函數表,所有的對象都共享這一個VTable。這個概念也叫做動態聯編,還有靜態聯編,這些概念都是通過在程序執行的時候表現出來的性質來定的,我們下面會看看它的“動”和“靜”究竟體現在哪里。

  先看一段代碼:

  class C0
  ...{
  public:
  void Test()
  ...{
  cout << "call C0 Test()。" << endl;
  }
  };

  這個類沒有虛函數,調用的時候就是靜態調用。調用的代碼如下:

  // 靜態編譯(早綁定 early binding)
  C0 *pO0;
  C0 obj0;
  pO0 = &obj0;
  pO0->Test();
  它的反匯編代碼如下:

  // 直接調用函數(已經知道地址)
  00401432 mov ecx,dword ptr [ebp-0Ch]
  00401435 call @ILT+160(C0::Test) (004010a5)
  下面看看帶虛函數的類:

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97