1. 程式人生 > >c++(成員函式的)過載、覆蓋與隱藏

c++(成員函式的)過載、覆蓋與隱藏

覆蓋,和隱藏是很不一樣的兩個概念,要重點區分。

過載(overload):同名函式變數,但屬於不同的函式型別。發生在同一個作用域內,即在同一個類中。如果跨類,在父類、子類當中存在同名的函式變數(即便是不同的函式型別),如果是 virtual 性質的,就是過載(也叫繼承,函式層面的繼承),如果是 non-virtual 性質的,(只要子類中有一個同名函式變數沒有用 virtual 修飾)就會發生隱藏——這個坑應該繞道走。

覆蓋(override):派生類函式覆蓋基類函式,必須有 virtual 關鍵字修飾,且函式型別相同,函式變數命名相同。

隱藏(hide):有些筆記中會寫作“overwrite”,但這個詞不是 C++ 中的術語,是

不規範的寫法。在程式碼層面上,隱藏很容易讓人困擾,但其本質上只是巢狀作用域中命名隱藏問題。和以下程式碼同理。

ps 即便函式變數的型別不同,但編譯器只關注變數的命名。如果還是似懂非懂,感到困惑,可以去翻書《C++ Primer》第 547 頁。

一如往常,名字查詢先於型別檢查。

void Print(int var)
{
  cout << var << endl;
}
int main(void)
{
  int var = 10;   // 呼叫 Print() 時,外層作用域的同名變數已經被隱藏
  {
    float var = 11.1;
    Print(var);   // float 隱式轉換成 int,列印 11
  }
  return 0;
}

在《Effective C++》一書條款 36 提到“絕不重新定義繼承而來的 non-virtual 函式”,就是為了避免隱藏帶來的問題。

相關推薦

C++中成員函式過載覆蓋隱藏

成員函式被過載的特徵: (1)相同的範圍(在同一個類中); (2)函式名字相同; (3)引數不同; (4)virtual關鍵字可有可無。 覆蓋是指派生類函式覆蓋基類函式,特徵是: (1)不同的範圍(分別位於派生類與基類); (2)函式名字相同; (3)引數相同; (4)基類函

成員函式過載覆蓋隱藏詳細【轉】

(轉自:https://blog.csdn.net/weixin_42205987/article/details/81569744) 成員函式的過載、覆蓋與隱藏 成員函式的過載(overload)、覆蓋/重寫(override)與隱藏/重定義(hide)很容易混淆,C++程式設計師必須要搞

成員函式過載覆蓋隱藏詳細

成員函式的過載、覆蓋與隱藏 成員函式的過載、覆蓋(override)與隱藏很容易混淆,C++程式設計師必須要搞清楚概念,否則錯誤將防不勝防。 過載與覆蓋 成員函式被過載的特徵: (1)相同的範圍(在同一個類中) (2)函式名字相同

c++ 成員函式過載覆蓋隱藏

成員函式的過載、覆蓋與隱藏 成員函式的過載、覆蓋(override)與隱藏很容易混淆,C++程式設計師必須要搞清楚 概念,否則錯誤將防不勝防。 8.2.1 過載與覆蓋 成員函式被過載的特徵: (1)相同的範圍(在同一個類中); (2)函式名字相同; (3)引數不同;

C++類成員函式過載覆蓋隱藏區別

成員函式被過載(overload)的特徵:相同的範圍(在同一個類中);函式名字相同;引數不同;virtual關鍵字可有可無。覆蓋是指派生類函式覆蓋(override)基類函式,其特徵是:函式名字相同;引

C++成員函式過載覆蓋隱藏

 成員函式的過載、覆蓋(override)與隱藏很容易混淆,C++程式設計師必須要搞清楚概念,否則錯誤將防不勝防。 成員函式被過載的特徵:(1)相同的範圍(在同一個類中);(2)函式名字相同;(3)引數不同;(4)virtual 關鍵字可有可無。 覆蓋:派生類函式覆蓋基類函式

C++類型別成員函式過載覆蓋隱藏

類層次中的同名成員函式,有3種關係:過載overload,覆蓋override和隱藏oversee,hide。 1.成員過載 只有在同一個類中定義的同名成員函式才存在過載關係,主要特點是函式的引數和數目不同,但不能是引數的個數和型別均相同,僅僅依靠返回值的不同來區分函式,和

C++類成員函式過載覆蓋隱藏

成員函式被過載的特徵: (1)相同的範圍(在同一個類中); (2)函式名字相同; (3)引數不同; (4)virtual 關鍵字可有可無。 覆蓋是指派生類函式覆蓋基類函式,特徵是: (1)不同的範圍(分別位於派生類與基類); (2)函式名字相同; (3)引

轉載:成員函式過載覆蓋隱藏

成員函式的過載(overload)、覆蓋(override)與隱藏很容易混淆,C++程式設計師必須要搞清楚概念,否則錯誤將防不勝防。1 過載與覆蓋成員函式被過載的特徵:(1)相同的範圍(在同一個類中) ;(2)函式名字相同;(3)引數不同;(4)virtual 關鍵字可有可無。覆蓋是指派生類函式

8.2 成員函式過載覆蓋隱藏

成員函式的過載、覆蓋(override)與隱藏很容易混淆,C++程式設計師必須要搞清楚概念,否則錯誤將防不勝防。 8.2.1 過載與覆蓋 成員函式被過載的特徵: (1)相同的範圍(在同一個類中); (2)函式名字相同; (3)引數不同; (4)virtual 關鍵字可有

成員函式過載覆蓋隱藏

基類和派生類類成員函式的過載、覆蓋(override)與隱藏很容易混淆,C++程式設計師必須要搞清楚概念,否則錯誤將防不勝防。 1.過載與覆蓋 成員函式被過載的特徵: (1)相同的範圍(在同一個類中); (2)函式名字相同; (3)引數不同; (4)virtual 關鍵字

c++成員函式過載覆蓋隱藏

覆蓋,和隱藏是很不一樣的兩個概念,要重點區分。 過載(overload):同名函式變數,但屬於不同的函式型別。發生在同一個作用域內,即在同一個類中。如果跨類,在父類、子類當中存在同名的函式變數(即便是不同的函式型別),如果是 virtual 性質的,就是過載(也叫繼承,

C++中類成員函式過載覆蓋隱藏的區別,超清楚!

1.成員函式被過載的特徵: (1)相同的範圍(在同一個類中); (2)函式名字相同; (3)引數不同; (4)virtual 關鍵字可有可無。 2.覆蓋是指派生類函式覆蓋基類函式,特徵是: (1)不同的範圍(分別位於派生類與基類); (2)函式名字相同;

成員函式過載覆蓋隱藏區別 (C++)

      這是本人第一次寫部落格,主要是想記錄自己的學習過程、心得體會,一是可以方便以後回顧相關知識,二是可以與大家相互學習交流。       關於C++中類成員函式的過載、覆蓋和隱藏區別,第一次看到這個問題是在準備找工作的時候在牛客網中(http://www.nowcoder.com/questionT

成員函式過載覆蓋隱藏(遮蔽)的區別

a.成員函式被過載的特徵: (1)相同的範圍(在同一個類中); (2)函式名字相同; (3)引數不同; (4)virtual 關鍵字可有可無。 b.覆蓋是指派生類函式覆蓋基類函式,特徵是: (1)不同的範圍(分別位於派生類與基類); (2)函式名字相同;

成員函式過載覆蓋隱藏區別?

#include <iostream> #include <complex> using namespace std; class Base { public:     virtual void a(int x)    {    cout << "Base::a(int)"

成員函式過載覆蓋隱藏區別

成員函式被過載的特徵 (1)相同的範圍(在同一個類中);   (2)函式名字相同;   (3)引數不同;   (4)virtual 關鍵字可有可無。   覆蓋是指派生類函式覆蓋基類函式,特徵是 (1)不同的範圍(分別位於派生類與基類);   (2)函式名字相同;   (3)引數相同;   (4)基類函式

C++中的函式過載覆蓋隱藏

在C++語言中,函式扮演著很重要的角色,不管面向過程設計,還是基於物件設計;不管是面向物件程式設計,還是基於泛型程式設計,函式都可以隨處而見。在談論C++中的函式過載、覆蓋和隱藏之前,先回顧下函式的基礎知識。   函式的宣告包括函式的返回值型別,函式名稱,引數列表(引數的型別、引數的個數、引數的

成員函式過載覆蓋隱藏的區別

參考:https://www.nowcoder.com/questionTerminal/266d3a6d4f1b436aabf1eff3156fed951.函式過載的特徵:(1)必須在同一個類中(相同範圍)(2)函式名字必須相同但是函式型別可以不相同(3)引數類表可以不同(

(1) C++:過載覆蓋隱藏

  C++之中的過載、覆蓋、隱藏   過載 覆蓋 過載與覆蓋的區別 相關程式碼 隱藏   過載 過載是指函式不同的引數表,對同名函式的名稱做修飾,然後這些同名函式就成了不同的函式。在同一可訪問區域內被宣告的幾