1. 程式人生 > >C++中過載、重寫(覆蓋)的區別例項分析

C++中過載、重寫(覆蓋)的區別例項分析

640?wx_fmt=jpeg&wxfrom=5&wx_lazy=1

本文例項講述了C++中過載、重寫(覆蓋)和隱藏的區別,對於C++面向物件程式設計來說是非常重要的概念。具體分析如下:

1.過載:過載從overload翻譯過來,是指同一可訪問區內被宣告的幾個具有不同引數列(引數的型別,個數,順序不同)的同名函式,根據引數列表確定呼叫哪個函式,過載不關心函式返回型別。

示例程式碼如下:

class A{public:  void test(int i);  void test(double i);  void test(int i, double j);  void test(double i, int j);  int test(int i);         //錯誤,非過載
};
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

前四個互為過載函式,最後一個和第一個不是過載函式。

2.重寫:重寫翻譯自override,也翻譯成覆蓋(更好一點),是指派生類中存在重新定義的函式。其函式名,引數列表,返回值型別,所有都必須同基類中被重寫的函式一致。只有函式體不同(花括號內),派生類呼叫時會呼叫派生類的重寫函式,不會呼叫被重寫函式。重寫的基類中被重寫的函式必須有virtual修飾。

例項程式碼如下:

#include<iostream>using namespace std;class A{public:  virtual void fun3(int i){    cout << "A::fun3() : "
<< i << endl;  } };class B : public A{public:    //重寫  virtual void fun3(double i){    cout << "B::fun3() : " << i << endl;  } };int main(){    A a;  B b;  A * pa = &a;  pa->fun3(3);  pa = &b;  pa->fun3(5);  system("pause");  return 0; }
  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

  • 21

  • 22

  • 23

  • 24

  • 25

  • 26

上面為虛擬函式實現多型的程式碼,不明白的先看虛擬函式實現多型的原理。

3、總結

過載和重寫的區別:

(1)範圍區別:重寫和被重寫的函式在不同的類中,過載和被過載的函式在同一類中。 
(2)引數區別:重寫與被重寫的函式引數列表一定相同,過載和被過載的函式引數列表一定不同。 
(3)virtual的區別:重寫的基類必須要有virtual修飾,過載函式和被過載函式可以被virtual修飾,也可以沒有。

0?wx_fmt=gif