程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 多態和重載

多態和重載

編輯:C++入門知識

一.多態
(鏈接機制)
多態(Polymorphism)按字面的意思就是“多種形狀”。引用Charlie Calverts對多態的描述——多態性是允許你將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之後,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作(摘自“Delphi4 編程技術內幕”)。簡單的說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。多態性在Object Pascal和C++中都是通過虛函數(Virtual Function) 實現的。

  多態性是允許將父對象設置成為和一個和多個它的子對象相等的技術,比如Parent:=Child; 多態性使得能夠利用同一類(基類)類型的指針來引用不同類的對象,以及根據所引用對象的不同,以不同的方式執行相同的操作.
  多態的作用:把不同的子類對象都當作父類來看,可以屏蔽不同子類對象之間的差異,寫出通用的代碼,做出通用的編程,以適應需求的不斷變化。
  賦值之後,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。也就是說,父親的行為像兒子,而不是兒子的行為像父親。
  舉個例子:從一個基類中派生,響應一個虛命令,產生不同的結果。
  比如從某個基類繼承出多個對象,其基類有一個虛方法Tdoit,然後其子類也有這個方法,但行為不同,然後這些子對象中的任何一個可以附給其基類的對象,這樣其基類的對象就可以執行不同的操作了。實際上你是在通過其基類來訪問其子對象的,你要做的就是一個賦值操作。
  使用繼承性的結果就是可以創建一個類的家族,在認識這個類的家族時,就是把導出類的對象 當作基類的的對象,這種認識又叫作upcasting。這樣認識的重要性在於:我們可以只針對基類寫出一段程序,但它可以適 應於這個類的家族,因為編譯器會自動就找出合適的對象來執行操作。這種現象又稱為多態性。而實現多態性的手段又叫稱動態綁定(dynamic binding)。
  簡單的說,建立一個父類的變量,它的內容可以是這個父類的,也可以是它的子類的,當子類擁有和父類同樣的函數,當使用這個變量調用這個函數的時候,定義這個變量的類,也就是父類,裡的同名函數將被調用,當在父類裡的這個函數前加virtual關鍵字,那麼子類的同名函數將被調用
  class A {
  public:
  A() {}
  virtual void foo() {
  cout << "This is A." << endl;
  }
  };
  class B : public A {
  public:
  B() {}
  void foo() {
  cout << "This is B." << endl;
  }
  };
  int main(int argc, char* argv[]) {
  A *a = new B();
  a->foo();
  return 0;
  }
  這將顯示:
  This is B.
  如果把virtual去掉,將顯示:
  This is A.
  前面的多態實現使用抽象類,並定義了虛方法.

二.重載
(編譯機制)
重載決策是一種編譯時機制,用於在給定了參數列表和一組候選函數成員的情況下,選擇一個最佳函數成員來實施調用。函數重載就是一個類中有幾個同名函數但參數表不同:

重載分為普通方法重載和基類(也就是父類)虛方法的重載!

普通方法的重載指的是:類中兩個以上的方法(包括隱藏的繼承而來的方法),取的名字相同,但使用的參數類型或者參數個數不同!

對基類方法的重載是函數重載的另一種特殊形式。在派生類中重新定義此虛函數!方法名稱,返回值類型,參數表中的參數個數,類型,順序都必須和基類中的虛函數完全一致!在派生類中聲明對虛方法的重載,要求在聲明中加上override關鍵字,而且不能有new,static或virtual修飾符!


作者:lxh1230119

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved