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

淺談C++重載、重寫、重界說

編輯:關於C++

淺談C++重載、重寫、重界說。本站提示廣大學習愛好者:(淺談C++重載、重寫、重界說)文章只能為提供參考,不一定能成為您想要的結果。以下是淺談C++重載、重寫、重界說正文


1、重載(overload)

指函數名雷同,然則它的參數表列個數或次序,類型分歧。然則不克不及靠前往類型來斷定。

(1)雷同的規模(在統一個感化域中) ;

(2)函數名字雷同;

(3)參數分歧;

(4)virtual 症結字無關緊要。

(5)前往值可以分歧;

2、重寫(也稱為籠罩 override)

是指派生類從新界說基類的虛函數,特點是:

(1)不在統一個感化域(分離位於派生類與基類) ;

(2)函數名字雷同;

(3)參數雷同;

(4)基類函數必需有 virtual 症結字,不克不及有 static 。

(5)前往值雷同(或是協變),不然報錯;<—-協變這個概念我也是第一次才曉得…

(6)重寫函數的拜訪潤飾符可以分歧。雖然 virtual 是 private 的,派生類中重寫改寫為 public,protected 也是可以的

3、重界說(同樣成隱蔽)

(1)不在統一個感化域(分離位於派生類與基類) ;

(2)函數名字雷同;

(3)前往值可以分歧;

(4)參數分歧。此時,豈論有沒有 virtual 症結字,基類的函數將被隱蔽(留意別與重載和籠罩混雜) 。

(5)參數雷同,然則基類函數沒有 virtual症結字。此時,基類的函數被隱蔽(留意別與籠罩混雜) 。

#include <iostream>
#include <complex>
using namespace std;

class Base
{
public:
  virtual void a(int x)  {  cout << "Base::a(int)" << endl;   }
  // overload the Base::a(int) function
  virtual void a(double x) {  cout << "Base::a(double)" << endl;  }
  virtual void b(int x)  {  cout << "Base::b(int)" << endl;   }
  void c(int x)      {  cout << "Base::c(int)" << endl;   }
};

class Derived : public Base
{
public:
  // redefine the Base::a() function
  void a(complex<double> x)  {  cout << "Derived::a(complex)" << endl;   }
  // override the Base::b(int) function
  void b(int x)        {  cout << "Derived::b(int)" << endl;     }
  // redefine the Base::c() function
  void c(int x)        {  cout << "Derived::c(int)" << endl;     }
};

int main()
{
  Base b;
  Derived d;
  Base* pb = new Derived;
  // ----------------------------------- //
  b.a(1.0);               // Base::a(double)
  d.a(1.0);               // Derived::a(complex)
  pb->a(1.0);              // Base::a(double), This is redefine the Base::a() function
  // pb->a(complex<double>(1.0, 2.0));  // clear the annotation and have a try
  // ----------------------------------- //
  b.b(10);                // Base::b(int)
  d.b(10);                // Derived::b(int)
  pb->b(10);               // Derived::b(int), This is the virtual function
  // ----------------------------------- //
  delete pb;

  return 0;
}

經由過程這裡可以看出:

1. Base類中的第二個函數a是對第一個的重載

2. Derived類中的函數b是對Base類中函數b的重寫,即便用了虛函數特征。

3. Derived類中的函數a是對Base淚中函數a的隱蔽,即重界說了。

4.pb指針是一個指向Base類型的指針,然則它現實指向了一個Derived的空間,這裡對pd挪用函數的處置(多態性)取決因而否重寫 (虛函數特征)了函數,若沒有,則仍然挪用基類。

5. 只要在經由過程基類指針或基類援用 直接指向派生類類型時多態性才會起感化。

6. 由於Base類的函數c沒有界說為virtual虛函數,所以Derived類的函數c是對Base::c()的重界說。

以上這篇淺談C++重載、重寫、重界說就是小編分享給年夜家的全體內容了,願望能給年夜家一個參考,也願望年夜家多多支撐。

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