【C++基礎】過載overload、重寫(覆蓋)override、隱藏hide的區別
過載overload
過載是指不同的函式使用相同的函式名,但是函式的引數個數或型別不同。呼叫的時候根據函式的引數來區別不同的函式。
- 相同的範圍(在同一個類中)
- 函式名字相同
- 引數不同
- virtual可有可無
- 編譯期繫結,與多型無關
重寫(覆蓋)override
重寫/覆蓋是在在派生類中重新對基類中的虛擬函式重新實現;即函式名和引數都一樣,只是函式的實現體不一樣。
- 不同的範圍(分別位於派生類和基類)
- 函式名相同
- 引數相同
- 基類函式必須有virtual關鍵字
- 執行時繫結,多型
隱藏hide
關於隱藏,參見: Effective C++:條款33:避免遮掩繼承而來的名稱
隱藏是指派生類中的函式把基類中相同名字的函式遮蔽掉;
- 如果派生類的函式與基類的函式同名,但引數不同,此時,不論有無virtual關鍵字,基類的函式將被隱藏
- 如果派生類的函式與基類的函式同名,但引數相同,此時,如果基類函式沒有virtual關鍵字,基類的函式將被隱藏
#include <cstring> #include <iostream> using namespace std; class Base { public: virtual void f(float x){ cout << "Base::f(float) " << x << endl; } void g(float x){ cout << "Base::g(float) " << x << endl; } void h(float x){ cout << "Base::h(float) " << x << endl; } }; class Derived : public Base { public: virtual void f(float x){ cout << "Derived::f(float) " << x << endl; } void g(int x) { cout << "Derived::g(int) " << x << endl; } void h(float x){ cout << "Derived::h(float) " << x << endl; } }; int main() { Derived d; Base *pb = &d; Derived *pd = &d; // Good : behavior depends solely on type of the object pb->f(3.14f); // Derived::f(float) 3.14 pd->f(3.14f); // Derived::f(float) 3.14 // Bad : behavior depends on type of the pointer pb->g(3.14f); // Base::g(float) 3.14 pd->g(3.14f); // Derived::g(int) 3 (surprise!) // Bad : behavior depends on type of the pointer pb->h(3.14f); // Base::h(float) 3.14 (surprise!) pd->h(3.14f); // Derived::h(float) 3.14 return 0; }
- 函式Derived::f(float) 覆蓋/重寫了Base::f(float)
- 函式Derived::g(int) 隱藏了 Base::g(float)
- 函式Derived::h(float) 隱藏了 Base:h(float)
在第一種呼叫中,函式的行為取決於指標所指向的物件;在第二第三中呼叫中,函式的行為取決於指標的型別。所以說,隱藏破壞了多型。
隱藏例項:
#include <cstring> #include <iostream> using namespace std; class Base { public: void f(float x){ } }; class Derived : public Base { public: void f(float x, float y){ } void test() { f(1.0f); } }; int main() { return 0; }
VS: error C2660: 'Derived::f' : function does not take 1 arguments
在派生類的域中,基類中的函式被隱藏。
相關推薦
【C++基礎】過載overload、重寫(覆蓋)override、隱藏hide的區別
過載overload 過載是指不同的函式使用相同的函式名,但是函式的引數個數或型別不同。呼叫的時候根據函式的引數來區別不同的函式。 相同的範圍(在同一個類中)函式名字相同引數不同virtual可有可無編譯期繫結,與多型無關 重寫(覆蓋)override 重寫/覆蓋是在在
C++ 類成員函式的過載(overload),重寫/覆蓋(override),隱藏
C++ 類層次中的同名函式,有三種關係: 過載(overload) 重寫、覆蓋(override) 隱藏(hide,oversee) 過載 c++函式過載 相同的範圍(在同一個類中)
【C++專題】過載(overload)、覆蓋(override)、隱藏(hide) 辨析
寫正題之前,先給出幾個關鍵字的中英文對照,過載(overload),覆蓋(override),隱藏(hide)。在早期的C++書籍中,可能翻譯的人不熟悉專業用語(也不能怪他們,他們不是搞計算機程式設計的,他們是英語專業的),常常把過載(overload)和覆蓋(ov
1、【C++基礎】簡介
void指針 通用 if...else 重載 全局變量 但是 區別 模板庫 stl C++ 簡介 C++ 是一種靜態類型的、編譯式的、通用的、大小寫敏感的、不規則的編程語言,支持過程化編程、面向對象編程和泛型編程。 C++ 被認為是一種中級語言,它綜合了高級語言和低級語言
23、【C++基礎】復制構造函數
amp sna c++基礎 cout span 另一個 include sin str 拷貝構造函數 拷貝構造函數是一種特殊的構造函數,它在創建對象時,是使用同一類中之前創建的對象來初始化新創建的對象。拷貝構造函數通常用於: 通過使用另一個同類型的對象來初始化新創建的對
28、【C++基礎】線程同步
有一個 handles 返回 由於 離開 hand 應用 數加 out 線程同步的方法主要有四種(《操作系統教程》一書): 1、臨界區:通過對多線程的串行化來訪問公共資源或一段代碼,速度快,適合控制數據訪問。 2、互斥量:為協調一起對一個共享資源的單獨訪問而設
【C#基礎】之訪問修飾符、類與屬性、類與結構的簡單介紹
在學方法之前先學習類…… 介紹類之前先介紹下C#中常用的四個訪問修飾符: 我的疑問:結構與類的區別?結構裡不能定義方法,它們都可以定義多個屬性,什麼時候要用結構?什麼時候要用類? 一、C#中的4個常用訪問修飾符: public:可以在任何地方被訪問 internal:只能
【C#基礎】Path類、File類、Directory類
1.Path類(靜態類,用於操作檔案路徑) Path類提供的常用靜態方法: string str = @”C:\Users\YF105\Desktop\new.txt”; Path.GetFileName(str);//獲取檔名,包含副檔名 Path.
【C#基礎】判斷字串是否為空、判斷字元是否為數字
一、判斷字串是否為空 String.Empty和string=””是一樣的,同樣都是需要佔用記憶體空間<空字串>;但優先推薦使用string.Empty Console.WriteLine("".Equals(string.Empty));//結果:true 還一種高效判斷方
【C#基礎】out、ref、params引數
1)、out引數。 如果你在一個方法中,返回多個相同型別的值的時候,可以考慮返回一個數組。 但是,如果返回多個不同型別的值的時候,返回陣列就不行了,那麼這個時候,我們可以考慮使用out引數。out引數要求必須在方法的內部為其賦值,out引數就側重於在一個方法中可以返回多個不同型別的值。 clas
【C#基礎】列舉(Enum)、結構體(Struct)、委託(Delegate)
1.列舉(Enum) 確定數量,確定取值。方向(東南西北),性別(男女) 語法:[public] enum 列舉名 { 值1, 值2, 值3,
【C++基礎】----操作符過載(03)
今天我們來討論操作符過載中比較重要的一個內容:賦值操作符的過載 1. 常量不允許出現在=左邊 由於編譯期對賦值有著嚴格的要求和限制,因此強制 operator=() 為成員函式。 成員函式的優點在於在呼叫時,永遠有一個隱式的this指標被呼叫,而反觀友元函式,我們可以將任何
【C++基礎】----運算子過載(01)
一方面,在C++中,運算子過載( operator overloading)允許把標準運算子(如+ - * / % 等)應用於自定義資料型別的物件。 這樣可以直觀自然地看出自定義資料型別間的運算,並且提高程式的可讀性。 另一方面,運算子過載僅僅是一種語法上的方便。
【c#基礎】int 轉換 string,string 轉換 int
方法 res data int 是否 tryparse php convert out 1、int 轉換 string方法:toString() 或者 Convert.toString()舉例: [code]phpcode://toString() int a =1; st
【C#基礎】輸入一個字元,判定它是什麼型別的字元(大寫字母,小寫字母,數字或者其它字元)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _02_判斷使用者輸入字元型別 { c
【c++基礎】從json檔案提取資料
前言 標註資料匯出檔案是json格式的,也就是python的dict格式,需要讀取標註結果,可以使用c++或者python,本文使用c++實現的。 JsonCpp簡介 JsonCpp是一種輕量級的資料交換格式,是個跨平臺的開源庫,可以從github和sourceforge上下載原始碼。 JsonCpp
【C++筆記】編寫類string的建構函式、解構函式和賦值函式
#include<iostream> using namespace std; class String { public: String(const char *str=NULL); //普通建構函式 String(const Stri
【C#基礎】數學運算子自加和自減運算子
1.自加(先加和後加) 無論先加還是後加,值都自加1 ``` int num = 45; int result; //後加,先用num的值運算,num再自加1,result的值為45,num的值為46 result = num++; //先加,num的值先自加1,再用num
【C#基礎】while迴圈和do-while迴圈
1.While迴圈(先判斷迴圈條件,在執行迴圈體) static void Main(string[] args) { int index = 1; int sum = 0;
【C#基礎】迴圈的中斷Break , Continue , return , go-to
Break : 跳出迴圈體,繼續執行下面的程式碼 Continue : 跳出本次迴圈,不在執行continue下面程式碼,繼續判斷迴圈條件,進行下一次迴圈 static void Main(string[] args) {