重寫 過載和重定義的區別

2021-06-29 08:07:26 字數 4347 閱讀 6427

首先,重寫是指派生類的方法覆蓋基類的方法,要求方法名、方法的引數都相同。重寫是c++中實現多型這個特性基礎。重寫又稱為覆蓋,是指派生類函式覆蓋基類函式,與重定義不同,重寫要求被重寫的基類函式為虛函式。

例如下面的**:?

12

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

classbase;

classderived :publicbase

};

classchild :publicderived

};

總結一下,重寫是指派生類重新定義了基類的虛函式,基類函式必須有virtual關鍵字修飾,不能有static關鍵字;返回值型別必須是相同的,或者是協變的;此外重寫函式的訪問修飾符可以不同。

注意:一般重寫要求函式具有完全相同的入參,否則就會提示錯誤,而這個規則對於協變而言則有所放鬆。覆蓋的返回值不區分基類或者派生類,如下**:?

12

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

classbase

};

classderived :publicbase

};

//協變

classfather;

classchild

};

在上面協變的例子中,要求base和derived兩個類必須在使用前被完整的定義。

協變返回型別的優勢在於,若是我們使用father,就能獲得乙個抽象的base,如果我們正在處理child,就會獲得乙個derived。協變的返回機制將我們從這樣一種處境中解脫出來:不得不使用易於出錯的轉換操作來「重新」提供型別資訊,而這種資訊是一開始就不應該丟掉的。

然後是過載(overload),過載是應用於相同作用域之內的同名函式,由於引數列表不同而產生的不同的實現方法。此處提到的作用域有:全域性作用域、區域性作用域以及類作用域,當在同乙個作用域內的時候同名的函式或者稱之為方法,由於引數列表的不同,而獲得的不同的函式。?

12

3

intsum(inta,intb);

intsum(inta,intb,intc);

intsum(floata,floatb);

過載是一種語言特性,是一種語法規則,與多型無關,與物件導向無關。

重定義則是經常出現在基類和派生類之間,歸結起來有如下的特點:

1)不在同乙個作用域,主要是指類作用域,分別位於基類和派生類之中;

2)函式名稱相同,但是返回值可以不同;

3)引數不同時,無論有沒有virtual關鍵字,基類的函式都會被隱藏;引數相同時,但是基類函式沒有關鍵字virtual,此時基類函式被隱藏。

例如:?

12

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

classbase

voidprint()

intsum(inta,intb);

private:

//

};

classderived :publicbase

voidprint()

intsum(inta,intb,intc);

};

在執行derived的例項的時候可以很容易的發現,基類中sum函式被隱藏了。因此重定義又稱為隱藏,是指派生類的函式遮蔽了與其同名的基類函式。?

12

3

4

5

6

7

8

9

10

11

12

13

14

15

int_tmain(intargc, _tchar* argv)

例如上面的類,我們在如上呼叫的時候得到了下面的輸出:

重寫 過載和重定義的區別

首先,重寫是指派生類的方法覆蓋基類的方法,要求方法名 方法的引數都相同。重寫是c 中實現多型這個特性基礎。重寫又稱為覆蓋,是指派生類函式覆蓋基類函式,與重定義不同,重寫要求被重寫的基類函式為虛函式。例如下面的 class base class derived public base class ch...

重寫 過載和重定義

函式過載 1 必須在乙個類中 2 子類無法過載父類的函式,父類同名的函式將被名稱覆蓋 不管引數相不相同 3 過載是在編譯期間根據引數型別和個數決定函式呼叫 函式重寫 1 必須發生於父類和子類之間 2 父類和子類之間必須有相同的函式原型 3 使用virtual關鍵字之後可以產生多型 如果不使用virt...

過載 重寫 重定義區別

過載 函式名相同,函式的引數個數 引數型別或引數順序三者中必須至少有一種不同。函式返回值的型別可以相同,也可以不相同。發生在乙個類內部。重定義 也叫做隱藏,子類重新定義父類中有相同名稱的非虛函式 引數列表可以不同 指派生類的函式遮蔽了與其同名的基類函式。可以理解成發生在繼承中的過載。重寫 也叫做覆蓋...