1. 程式人生 > >c++ const在過載overload和覆蓋override上使用區別

c++ const在過載overload和覆蓋override上使用區別

1.overload 過載

首先講講const在過載上的使用,過載的目的是為了根據不同的輸入來呼叫不同的同名函式。const的位置不同會引起不同的效果,我在一篇轉載文章中具體闡述過:點選開啟連結

再歸納一下,能否構成過載的區別在於使用者能否知曉函式的不同:

1)放在函式尾部修飾

作為對函式不會修改成員變數的修飾,即void fun() const;和void fun(); 這種情況下const能構成過載,使用者對於兩個函式,一個會修改引數,一個不會修改引數,這是足以區分兩個函式的,因此能構成過載。

2)放在函式返回值處修飾

作為對函式返回值的修飾,即const void fun(); 或者 const char* fun() 或者char* const fun(); 與沒有const修飾的函式之間。這種情況下只是向用戶返回一個呼叫的值,使用者只管接受,他們傳給函式的值並未發生變化,且函式內部發生什麼事他們也不曾知曉(不像1)中有修改引數的區別),所以使用者並不知曉函式的區別,因此對於函式返回值的const修飾無法構成過載。

3)放在函式引數中

這種情況下要分類討論了:

i.如果是值傳遞,即:void fun(const int i); 和 void fun(int i );則不會構成過載,值是複製進去的,裡面發生了什麼變化都和使用者的值無關,因此使用者不會知曉。

ii.如果是引用/指標傳遞,即void fun(const int *i); 和 void fun(int *i);或者void fun(const int& i);和 void fun(int& i);之間,這種情況會構成過載,因為使用者傳入的值可能會被改變,因此這是足以區分函式的。

2.override覆蓋

覆蓋是在面向物件角度的類多型中提出的,派生類通過對基類中虛擬函式覆蓋來達到動態繫結的效果。要構成覆蓋的條件是:

派生類的函式原型必須完全覆蓋基類中的宣告,包括:引數列表、返回型別、常量性。

因此對於const的修飾,要構成覆蓋,還是必須完全一致,預設會導致報錯,例如:Base類中: virtual void fun() const;  Derived類中:void fun(); 會導致報錯(另外注意派生類中virtual可加可不加)

因此const在覆蓋中沒有例外,常量性也必須完全符合。

注:對於完全覆蓋的概念上,唯一有例外的是在於返回型別上,若該函式是返回類指標/引用則會是例外,例如:

Base類中:

Base* fun();

Derived類中:

Derived* fun();

這是可以構成覆蓋的,因為Derived類是繼承於Base類的,派生類中的同名函式可以返回基類所派生出來的型別。

相關推薦

c++ const過載overload覆蓋override使用區別

1.overload 過載 首先講講const在過載上的使用,過載的目的是為了根據不同的輸入來呼叫不同的同名函式。const的位置不同會引起不同的效果,我在一篇轉載文章中具體闡述過:點選開啟連結 再歸納一下,能否構成過載的區別在於使用者能否知曉函式的不同: 1)放在函式尾部

重寫(overwrite)、過載(overload)覆蓋(override)三者之間的區別

        關於這三者之間,有很多書都說方法的過載就是方法的重寫,也有很多書將兩者加以區分,當然,也有很多書將覆蓋和過載合併。正所謂人言可謂,我現在都開始懷疑我以前認為的兩者說是不是正確的,當然,我不是認為兩者說屬於謬論。可是別人的三說論也有道理。我思索了半天也弄不清楚

Java中過載(Overload)重寫(Override)的區別

過載(Overload) 過載是指在一個類裡面,方法名相同,引數不同。java中有構造器過載和方法過載(意義是一樣的,叫法不同) public class Car { private String name; private String p

[C++]成員函式的過載(overload)、覆蓋(override)隱藏(hide)

C++成員函式的過載、覆蓋和隱藏 1. 過載與覆蓋 成員函式被過載的特徵是: 具有相同的作用域(即同一個類定義中); 函式名字相同; 引數型別、順序或數目不同(包括); virtual 關鍵字可有可無。 覆蓋是指派生類重新實現(或者改寫)了基

C++學習之多型及過載(overload),覆蓋(override),隱藏(hide)的區別

C++程式語言是一款應用廣泛,支援多種程式設計的計算機程式語言。我們今天就會為大家詳細介紹其中C++多型性的一些基本知識,以方便大家在學習過程中對此能夠有一個充分的掌握。   多型性可以簡單地概括為“一個介面,多種方法”,程式在執行時才決定呼叫的函式,它是面向物件程式設計

C++多型及過載(overload),覆蓋(override),隱藏(hide)的區別

C++程式語言是一款應用廣泛,支援多種程式設計的計算機程式語言。我們今天就會為大家詳細介紹其中C++多型性的一些基本知識,以方便大家在學習過程中對此能夠有一個充分的掌握。   多型性可以簡單地概括為“一個介面,多種方法”,程式在執行時才決定呼叫的函式,它是面向物件程式設

C++專題】過載(overload)、覆蓋(override)、隱藏(hide) 辨析

  寫正題之前,先給出幾個關鍵字的中英文對照,過載(overload),覆蓋(override),隱藏(hide)。在早期的C++書籍中,可能翻譯的人不熟悉專業用語(也不能怪他們,他們不是搞計算機程式設計的,他們是英語專業的),常常把過載(overload)和覆蓋(ov

重寫(overwrite)、重載(overload)覆蓋(override)三者之間的區別

ride 傳遞 方法 子類 bsp 區別 參數 定義 load 覆蓋:子類繼承了父類的同名無參函數。當子類從父類繼承了一個無參函數,而又定義了一個同樣的無參函數,則子類定義的方法覆蓋父類的方法,稱為覆蓋。 重載:子類繼承了父類的同名有參函數。

方法過載overload與重寫override區別

過載Overload 重寫Override 相同點 見下 見下 不同點 引數簽名必須不一致 引數簽名必須一致 不限制返回型別 返回型別必須一致 用於同一個類的所有方法(包括從父類中繼承而來的方法) 只用於子類重寫覆蓋父類的方法 不限制… 對方法的訪問許可權和丟擲異常

函式過載(overload)函式重寫(override)的基本規則

本文由Markdown語法編輯器編輯完成。 1. 前言:   在C++中有兩個非常容易混淆的概念,分別是函式過載(overload)和函式重寫(overwirte)。雖然只相差一個字,但是它們兩者之間的差別還是非常巨大的。而通過深入瞭解這兩個概念的區別,

過載(overload)重寫(overied,有的書也叫作“覆蓋”)的區別?

從定義上來說:   過載:是指允許存在多個同名函式,而這些函式的引數表不同(或許引數個數不同,或許引數型別不同,或許兩者都不同)。  重寫:是指子類重新定義父類虛擬函式的方法。 1.過載:過載從overload翻譯過來,是指同一可訪問區內被宣告的幾個具有不同引數列(引數的

c++ const、volatilemutable

const修飾普通變數和指標 const修飾變數,一般有兩種寫法: const TYPE value; TYPE const value; 這兩種寫法在本質上是一樣的。它的含義是:const修飾的型別為TYPE的變數value是不可變的。對於一個非指標的型別TYPE,無論怎麼寫,都是

38 C++基礎-過載一元二元運算子

1. 過載雙目運算子 例如一個 == 的demo 呼叫如下 #include "Time.h" #include "Date.h" #include <iostream> u

淺談c++中結構體共用體的區別

ont 基本類型 erl list 變量名 ext 使用結構體 oot 數據格式 在c++中,結構體(struct)和共用體(union)是兩種很相似的復合數據類型,都可以用來存儲多種數據類型,但是兩者還有很大的區別。 結構體(struct) 結構是用戶自定

C#中的overridnew修飾符區別(代碼)

之間 using stat ide post 不同的 虛擬 spa 代碼 在C#的繼承中嘗嘗會用到相關的修飾詞:override和new。這兩個修飾符都可以在新的子類中,重寫同名的父類方法。 override: 擴展或修改繼承的方法、屬性、索引器或事件的抽象或虛擬

C#的抽象類接口,區別與相似

serve 層次 一次 否則 聲明 多個 析構函數 而在 比喻 一、抽象類:抽象類是特殊的類,只是不能被實例化;除此以外,具有類的其他特性;重要的是抽象類可以包括抽象方法,這是普通類所不能的。抽象方法只能聲明於抽象類中,且不包含任何實現,派生類必須覆蓋它們

C++學習--------------棧記憶體堆記憶體的區別

資料結構中的堆與棧: 棧:是一種連續儲存的資料結構,具有先進後出的性質。通常的操作有入棧(圧棧)、出棧和棧頂元素。想要讀取棧中的某個元素,就要將其之前的所有元素出棧才能完成。類比現實中的箱子一樣。 堆:是一種非連續的樹形儲存資料結構,每個節點有一個值,整棵樹是經過排序的。特點是根結

C++靜態全域性變數全域性變數的區別

    靜態全域性變數 非靜態全域性變數 儲存方式 靜態儲存 靜態儲存 作用域 定義該變數的原始檔內 所有原始檔   解釋: 共同點:

c++中*p=ap=&a的區別

#include <iostream> using namespace std; int main() {     int a = 10;     int *PA = new int;     *PA = a;     cout << "*PA i

C++總結1——指標引用/陣列的區別【轉】

1.指標和引有什麼區別?(從反彙編角度回答)  a.其實引用和指標本質上是一樣的,他們的彙編指令都是兩行。  int a = 10;  int *p = &a;  //lea eax,[a]                          將a的地址放在