1. 程式人生 > >【C++基礎】過載overload、重寫(覆蓋)override、隱藏hide的區別

【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

1C++基礎簡介

void指針 通用 if...else 重載 全局變量 但是 區別 模板庫 stl C++ 簡介 C++ 是一種靜態類型的、編譯式的、通用的、大小寫敏感的、不規則的編程語言,支持過程化編程、面向對象編程和泛型編程。 C++ 被認為是一種中級語言,它綜合了高級語言和低級語言

23C++基礎復制構造函數

amp sna c++基礎 cout span 另一個 include sin str 拷貝構造函數 拷貝構造函數是一種特殊的構造函數,它在創建對象時,是使用同一類中之前創建的對象來初始化新創建的對象。拷貝構造函數通常用於: 通過使用另一個同類型的對象來初始化新創建的對

28C++基礎線程同步

有一個 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#基礎outrefparams引數

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) {