1. 程式人生 > >c++ --> 過載、重寫(覆蓋)和隱藏的區別

c++ --> 過載、重寫(覆蓋)和隱藏的區別

過載、重寫(覆蓋)和隱藏的區別

一、過載

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

示例程式碼如下:

classA{
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); //錯誤,非過載
};

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

二、隱藏

  隱藏是指派生類的函式遮蔽了與其同名的基類函式。注意只要同名函式,不管引數列表是否相同,基類函式都會被隱藏。

例項程式碼如下:

#include<iostream>
using namespace std;

classA{
public:
  void fun1(int i, int j){
    cout <<"A::fun1() : " << i <<" " << j << endl;
  }
};
classB : public A{
public:
  //隱藏
  void
fun1(double i){ cout <<"B::fun1() : " << i << endl; } }; int main(){ B b; b.fun1(5);//呼叫B類中的函式 b.fun1(1, 2);//出錯,因為基類函式被隱藏 system("pause"); return 0; }

三、重寫

  重寫翻譯自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(int 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");
  return0;
}

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

四、區別

過載和重寫的區別:

(1)範圍區別:重寫和被重寫的函式在不同的類中,過載和被過載的函式在同一類中。

(2)引數區別:重寫與被重寫的函式引數列表一定相同,過載和被過載的函式引數列表一定不同。

(3)virtual的區別:重寫的基類必須要有virtual修飾,過載函式和被過載函式可以被virtual修飾,也可以沒有。

隱藏和重寫,過載的區別:

(1)與過載範圍不同:隱藏函式和被隱藏函式在不同類中。

(2)引數的區別:隱藏函式和被隱藏函式引數列表可以相同,也可以不同,但函式名一定同;當引數不同時,無論基類中的函式是否被virtual修飾,基類函式都是被隱藏,而不是被重寫。

除錯執行如下程式碼:

#include<iostream>
using namespace std;
class A{
public:
  void fun1(int i, int j){
    cout <<"A::fun1() : " << i <<" " << j << endl;
  }
  void fun2(int i){
    cout <<"A::fun2() : " << i << endl;
  }
  virtual void fun3(int i){
    cout <<"A::fun3(int) : " << i << endl;
  }
};
class B : public A{
public:
//隱藏
   void fun1(double i){
     cout <<"B::fun1() : " << i << endl;
  }
//重寫
  void fun3(int i){
    cout <<"B::fun3(int) : " << i << endl;
  }
//隱藏
  void fun3(double i){
    cout <<"B::fun3(double) : " << i << endl;
  }
};

int main(){
  B b;
  A * pa = &b;
  B * pb = &b;
  pa->fun3(3);//重寫,多型性,呼叫B的函式
  b.fun3(10);//根據引數選擇呼叫哪個函式,可能重寫也可能隱藏,呼叫B的函式
  pb->fun3(20);//根據引數選擇呼叫哪個函式,可能重寫也可能隱藏,呼叫B的函式
  system("pause");
  return 0;
}

輸出結果為:

B::fun3(int) : 3
B::fun3(int) : 10
B::fun3(int) : 20
請按任意鍵繼續. . .

相關推薦

c++ --> 過載重寫覆蓋隱藏區別

過載、重寫(覆蓋)和隱藏的區別 一、過載   過載從overload翻譯過來,是指同一可訪問區內被宣告的幾個具有不同引數列(引數的型別,個數,順序不同)的同名函式,根據引數列表確定呼叫哪個函式,過載不關心函式返回型別。 示例程式碼如下: classA{ public: void test(

C++中過載重寫覆蓋隱藏區別例項分析

本文例項講述了C++中過載、重寫(覆蓋)和隱藏的區別,對於C++面向物件程式設計來說是非常重要的概念。具體分析如下: 1.過載:過載從overload翻譯過來,是指同一可訪問區內被宣告的幾個具有不同引數列(引數的型別,個數,順序不同)的同名函式,根據引數列表確定呼叫哪個函式,過載不關心函式返回型

C++中過載重寫覆蓋隱藏區別

基本概念: 過載:是指同一可訪問區內被宣告的幾個具有不同引數列(引數的型別,個數,順序不同)的同名函式,根據引數列表確定呼叫哪個函式,過載不關心函式返回型別。 示例: class A{ public: void test(int i); voi

C++中重載重寫覆蓋隱藏區別

post space csdn depend amp 不同類 sin ase 返回 轉載自:https://blog.csdn.net/zx3517288/article/details/48976097 基本概念: 重載:是指同一可訪問區內被聲明的幾個具有不同參數列(參數

C++中過載重寫覆蓋區別例項分析

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

過載重寫覆蓋隱藏

JAVA中語言中方法(函式)呼叫有兩種特殊的形態:過載與重寫;而C++由於增加了virtual這個虛擬函式關鍵字,給函式呼叫又增加了變數:除了過載、重寫(也稱覆蓋)之外還多了隱藏這麼一說。我相信我們絕大多數人寫程式碼時,為了程式的可讀性與趕速度的原則,下意識的避開這些類似於腦筋急轉彎的語法,儘量使用不同的函式

C#方法過載overload重寫覆蓋override隱藏new

轉載地址:https://blog.csdn.net/u010926964/article/details/20719951  過載、重寫、隱藏這三個概念對於很多人都不是很清晰,我也是差了很多資料又請教師哥才感覺能理解了,有不足之處還請老師同學們批評指正!   

JAVA中的基礎-----過載重寫覆蓋區別:overload與override

JAVA中多型的實現機制主要通過overload和override實現。 1)方法的過載:簡言之,就是指同一個類有多個同名的方法,這些方法擁有不同的引數(同名不同參)。可以認為是類中方法的多型性,也稱為編譯時多型。 2)方法的重寫(覆蓋):子類可覆蓋父類的方法,已達到“個性

Java重寫覆蓋隱藏

java中方法重寫(override)的要求: 1、子類中的方法與父類中的方法的返回型別: 如果返回型別是引用型別,則重寫方法的返回型別可以宣告為超類方法宣告的返回型別的子型別;如果返回型別是基本型別,則重寫方法的返回型別必須和超類方法的返回型別相同。   2、子類中的方法與

C#中重寫override覆蓋new區別

實現 div del end 抽象方法 ring reg strong AR 重寫 用關鍵字 virtual 修飾的方法,叫虛方法。可以在子類中用override 聲明同名的方法,這叫“重寫”。相應的沒有用virtual修飾的方法,我們叫它實方法。重寫會改變父類方法的功能。

【第8天】Java方法過載方法重寫覆蓋構造方法及引數傳值

1 方法過載(overload) 2 方法重寫(覆蓋)(override) 3 構造方法 4 引數傳值 1 方法過載(overload) 方法過載的作用? 同時滿足使用者的不同需求。 同一個方法,使用者可以傳入不同

面向物件簡答題:方法過載方法重寫覆蓋區別?

方法過載和方法重寫(覆蓋)的區別? 答: (1)相同點: ①方法名稱相同。 ②都屬於多型機制。 (2)不同點:位置、引數列表、許可權修飾符、返回值型別、丟擲異常不同。 過載(overload):發生在同一個類中,方法名相同,引數列表不

C#中子類對父類中虛方法的處理有重寫override覆蓋new,他們有什麼區別

在子類中用override重寫父類中用virtual申明的虛方法時,例項化父類呼叫該方法,執行時呼叫的是子類中重寫的方法; 如果子類中用new覆蓋父類中用virtual申明的虛方法時,例項化父類呼叫該方法,執行時呼叫的是父類中的虛方法; 示例程式碼: /// <

C#中重寫override覆蓋new虛擬Virtual關鍵字的區別

虛擬(Virtual) : virtual 關鍵字用於修飾方法、屬性、索引器或事件宣告,並使它們可以在派生類中被重寫。 預設情況下,方法是非虛擬的。不能重寫非虛方法。 virtual修飾符不能與static、abstract, private或override修

C#枚舉enum常量constreadonly

通過反射 false 註意 int 針對 美國 得到 通用方法 英語 const修飾的是(類)靜態常量,,其值是在編譯期間確定的readonly修飾的是動態常量。 A、C#中的const和readonly的區別 C#中定義常量有兩種方式,一種叫做靜態常量,使用“c

Linux後臺進程管理以及ctrl+z掛起ctrl+c中斷ctrl+退出ctrl+dEOF區別(轉)

列表 art 信息 csdn 而是 png detail tps 後臺 一、後臺進程管理命令 fg、bg、jobs、&、ctrl + z、ctrl + c、ctrl + \、ctrl + d1、 &加在一個命令的最後,可以把這個命令放到後臺執行 ,如fire

C++---過載重寫(覆蓋)重定義(隱藏)

我們經常會被過載、重寫、重定義經常被我搞混,今天就專門總結區別一下。 1.過載 1.過載概念: 過載指的都是函式過載,函式過載就是函式的一種特殊情況,C++允許在同一作用域中宣告幾個功能類似的同名函式,這些同名函式的形參列 表(引數個數、型別、順序)必須不同,常用來處理實現功能類

C++ 過載重寫(覆蓋)重定義(隱藏) 與 Java 過載重寫(覆蓋)隱藏區別

C++: 一、過載(overload) 指函式名相同,但是它的引數表列個數或順序,型別不同。但是不能靠返回型別來判斷。 (1)相同的範圍(在同一個作用域中) ; (2)函式名字相同; (3)引數不同; (4)virtual 關鍵字可有可無。 (5)返回值可以不同; 二、重寫(也稱為覆蓋

java 重寫override 過載overload 的實現原理

    剛開始學習Java的時候,就瞭解了Java這個比較有意思的特性:重寫 和 過載。開始的有時候從名字上還總是容易弄混。我相信熟悉Java這門語言的同學都應該瞭解這兩個特性,可能只是從語言層面上了解這種寫法,但是jvm是如何實現他們的呢,並不是很清楚。 過載官方給出的介

重寫override過載overload區別

1 /// <summary> 2 /// 定能基類動物類 3 /// </summary> 4 /// <returns></returns> 5 public class Anima