C++覆蓋、重載、多態區別


覆蓋:
在基類中定義了一個非虛擬函數,然后在派生類中又定義了一個同名同參數同返回類型的函數,這就是覆蓋了。
在派生類對象上直接調用這個函數名,只會調用派生類中的那個。

//coverage.cpp

 

#include <iostream>

using namespace std;

 

class A

{

public:

  void ShowMessage();

};

class B:public A

{

public:

  void ShowMessage();

};

 

void A::ShowMessage()

{

  cout<<"Hello,This is A./n";

  return;

}

void B::ShowMessage()

{

  cout<<"Hello,This is B./n";

  return;

}

 

int main()

{

  A* p;

  B memb;

  *p = memb;

  p->ShowMessage();

  memb.ShowMessage();

  return 0;

}

 

輸出為:
Hello,This is A.
Hello,This is B.
 
重載:
 
        

有兩個或多個函數名相同的函數,但是函數的形參列表不同。在調用相同函數名的函數時,根據形參列表確定到底該調用哪一個函數。

//reload

 

#include <iostream>

using namespace std;

 

class A

{

public:

  void ShowMessage();

  void ShowMessage(string str);

};

 

void A::ShowMessage()

{

cout<<"Hi,This is A./n";

  return;

}

void A::ShowMessage(string str)

{

  cout<<str<<endl;

  return;

}

 

int main()

{

  A mem;

  mem.ShowMessage();

  mem.ShowMessage("Hello.How are you?/n");

  return 0;

}

輸出為:
Hi,This is A.
Hello.How are you?
 
多態:
在基類中定義了一個虛擬函數,然后在派生類中又定義一個同名,同參數表的函數,這就是多態。多態是這3種情況中唯一采用動態綁定技術的一種情況。也就是說,通過一個基類指針來操作對象,如果對象是基類對象,就會調用基類中的那個函數,如果對象實際是派生類對象,就會調用派聲雷中的那個函數,調用哪個函數並不由函數的參數表決定,而是由函數的實際類型決定。

//poly.cpp

 

#include <iostream>

using namespace std;

 

class A

{

public:

   virtual void ShowMessage();

};

class B:public A

{

public:

  void ShowMessage();

};

 

void A::ShowMessage()

{

  cout<<"This is A./n";

  return;

}

void B::ShowMessage()

{

  cout<<"This is B./n";

  return;

}

 

int main()

{

  A* p;

  p=new A();

  p->ShowMessage();

  p=new B();

  p->ShowMessage();

  return 0;

}

輸出為:
This is A.
This is B.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM