C++中重載、重寫(覆蓋)和隱藏的區別實例分析

1.重載:重載從overload翻譯過來,是指同一可訪問區內被聲明的幾個具有不同參數列(參數的類型,個數,順序不同)的同名函數,根據參數列表確定調用哪個函數,重載不關心函數返回類型。

示例代碼如下:

1

2

3

4

5

6

7

8

class A{

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);???????? //錯誤,非重載

};

前四個互為重載函數,最后一個和第一個不是重載函數。

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

#include<iostream>
using namespace std;
class A {
public:void fun1(int i, int j) { cout << "A::fun1() : " << i << " " << j << endl; }
};class B : public A {
public://隱藏void fun1(double i) { cout << "B::fun1() : " << i << endl;}
};int main() 
{B b;b.fun1(5);          //調用B類中的函數b.fun1(1, 2);       //出錯,因為基類函數被隱藏return 0;
}

3.重寫:重寫翻譯自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(double i) { cout << "B::fun3() : " << i << endl; }
};
int main()
{A a;B b;A* pa = &a;pa->fun3(3);pa = &b;pa->fun3(5);return 0;
}

重載和重寫的區別:

  • 范圍區別:重寫和被重寫的函數在不同的類中,重載和被重載的函數在同一類中。
  • 參數區別:重寫與被重寫的函數參數列表一定相同,重載和被重載的函數參數列表一定不同。
  • virtual的區別:重寫的基類必須要有virtual修飾,重載函數和被重載函數可以被virtual修飾,也可以沒有。

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

  • 與重載范圍不同:隱藏函數和被隱藏函數在不同類中。
  • 參數的區別:隱藏函數和被隱藏函數參數列表可以相同,也可以不同,但函數名一定同;當參數不同時,無論基類中的函數是否被virtual修飾,基類函數都是被隱藏,而不是被重寫。

?

參考資料

1.?C++中重載、重寫(覆蓋)和隱藏的區別實例分析

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/385236.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/385236.shtml
英文地址,請注明出處:http://en.pswp.cn/news/385236.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

1024 科學計數法 (20 分

科學計數法是科學家用來表示很大或很小的數字的一種方便的方法&#xff0c;其滿足正則表達式 [-][1-9].[0-9]E[-][0-9]&#xff0c;即數字的整數部分只有 1 位&#xff0c;小數部分至少有 1 位&#xff0c;該數字及其指數部分的正負號即使對正數也必定明確給出。 現以科學計數法…

static、const用法

一、static用法 C的static有兩種用法&#xff1a;面向過程程序設計中的static和面向對象程序設計中的static。前者應用于普通變量和函數&#xff0c;不涉及類&#xff1b;后者主要說明static在類中的作用。 一、面向過程設計中的static 1、靜態全局變量&#xff1a;在全局變量前…

1025 反轉鏈表 (25 分

給定一個常數 K 以及一個單鏈表 L&#xff0c;請編寫程序將 L 中每 K 個結點反轉。例如&#xff1a;給定 L 為 1→2→3→4→5→6&#xff0c;K 為 3&#xff0c;則輸出應該為 3→2→1→6→5→4&#xff1b;如果 K 為 4&#xff0c;則輸出應該為 4→3→2→1→5→6&#xff0c;即…

1026 程序運行時間 (15 分

要獲得一個 C 語言程序的運行時間&#xff0c;常用的方法是調用頭文件 time.h&#xff0c;其中提供了 clock() 函數&#xff0c;可以捕捉從程序開始運行到 clock() 被調用時所耗費的時間。這個時間單位是 clock tick&#xff0c;即“時鐘打點”。同時還有一個常數 CLK_TCK&…

【C++基礎】常見面試問題(二)

1. 指針和引用的區別 指針保存的是所指對象的地址&#xff0c;引用是所指對象的別名&#xff0c;指針需要通過解引用間接訪問&#xff0c;而引用是直接訪問指針可以改變地址&#xff0c;從而改變所指的對象&#xff0c;而引用必須從一而終&#xff1b;引用在定義的時候必須初始…

1028 人口普查 (20 分)

某城鎮進行人口普查&#xff0c;得到了全體居民的生日。現請你寫個程序&#xff0c;找出鎮上最年長和最年輕的人。 這里確保每個輸入的日期都是合法的&#xff0c;但不一定是合理的——假設已知鎮上沒有超過 200 歲的老人&#xff0c;而今天是 2014 年 9 月 6 日&#xff0c;所…

static關鍵字用法

static修飾局部變量 靜態局部變量存儲在全局靜態區生存期為整個程序生命周期&#xff0c;但是其作用域仍與自動變量相同&#xff0c;只能在定義該變量的函數內使用該變量。退出該函數后&#xff0c;盡管該變量還繼續存在&#xff0c;但不能使用它。靜態局部變量若在聲明時未賦以…

1029 舊鍵盤 (20 分)

舊鍵盤上壞了幾個鍵&#xff0c;于是在敲一段文字的時候&#xff0c;對應的字符就不會出現。現在給出應該輸入的一段文字、以及實際被輸入的文字&#xff0c;請你列出肯定壞掉的那些鍵。 輸入格式&#xff1a; 輸入在 2 行中分別給出應該輸入的文字、以及實際被輸入的文字。每段…

volatile、const的用法

1. volatile 訪問寄存器要比訪問內存要塊&#xff0c;因此CPU會優先訪問該數據在寄存器中的存儲結果&#xff0c;但是內存中的數據可能已經發生了改變&#xff0c;而寄存器中還保留著原來的結果。為了避免這種情況的發生將該變量聲明為volatile&#xff0c;告訴CPU每次都從內存…

1030 完美數列 (25 分)

給定一個正整數數列&#xff0c;和正整數 p&#xff0c;設這個數列中的最大值是 M&#xff0c;最小值是 m&#xff0c;如果 M≤mp&#xff0c;則稱這個數列是完美數列。 現在給定參數 p 和一些正整數&#xff0c;請你從中選擇盡可能多的數構成一個完美數列。 輸入格式&#xff…

《STL源碼剖析常見面試問題》

1. 當vector的內存用完了&#xff0c;它是如何動態擴展內存的&#xff1f;它是怎么釋放內存的&#xff1f;用clear可以釋放掉內存嗎&#xff1f;是不是線程安全的&#xff1f; (1). vector內存用完了&#xff0c;會以當前size大小重新申請2*size的內存&#xff0c;然后把原來…

1034 有理數四則運算 (20 分)

本題要求編寫程序&#xff0c;計算 2 個有理數的和、差、積、商。 輸入格式&#xff1a; 輸入在一行中按照 a1/b1 a2/b2 的格式給出兩個分數形式的有理數&#xff0c;其中分子和分母全是整型范圍內的整數&#xff0c;負號只可能出現在分子前&#xff0c;分母不為 0。 輸出格式&…

1035 插入與歸并 (25 分)

根據維基百科的定義&#xff1a; 插入排序是迭代算法&#xff0c;逐一獲得輸入數據&#xff0c;逐步產生有序的輸出序列。每步迭代中&#xff0c;算法從輸入序列中取出一元素&#xff0c;將之插入有序序列中正確的位置。如此迭代直到全部元素有序。 歸并排序進行如下迭代操作&a…

迭代式失效情況

vector 向容器插入元素后&#xff1a; 如果容器是vector或string&#xff0c;且存儲空間被重新分配&#xff0c;則指向容器的迭代器會失效&#xff1b;如果存儲空間未重新分配&#xff0c;指向插入點位置號之前的元素的迭代器仍然有效&#xff0c;但是指向插入點之后的元素的迭…

1039 到底買不買 (20 分)

小紅想買些珠子做一串自己喜歡的珠串。賣珠子的攤主有很多串五顏六色的珠串&#xff0c;但是不肯把任何一串拆散了賣。于是小紅要你幫忙判斷一下&#xff0c;某串珠子里是否包含了全部自己想要的珠子&#xff1f;如果是&#xff0c;那么告訴她有多少多余的珠子&#xff1b;如果…

【Leetcode】111. 二叉樹的最小深度

給定一個二叉樹&#xff0c;找出其最小深度。 最小深度是從根節點到最近葉子節點的最短路徑上的節點數量。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定二叉樹 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它的最小深度 2. 解題思路&#xff1a;…

1040 有幾個PAT (25 分

字符串 APPAPT 中包含了兩個單詞 PAT&#xff0c;其中第一個 PAT 是第 2 位(P)&#xff0c;第 4 位(A)&#xff0c;第 6 位(T)&#xff1b;第二個 PAT 是第 3 位(P)&#xff0c;第 4 位(A)&#xff0c;第 6 位(T)。 現給定字符串&#xff0c;問一共可以形成多少個 PAT&#xff…

g

1. 何時需要成員初始化列表&#xff1f;過程是什么&#xff1f; 當初始化一個引用成員變量時&#xff1b;初始化一個const成員變量時&#xff1b;當調用一個基類的構造函數&#xff0c;而構造函數擁有一組參數時&#xff1b;當調用一個成員類的構造函數&#xff0c;而他擁有一組…

【Leetcode | 1】93. 復原IP地址

給定一個只包含數字的字符串&#xff0c;復原它并返回所有可能的 IP 地址格式。 示例: 輸入: "25525511135" 輸出: ["255.255.11.135", "255.255.111.35"] 方法一&#xff1a; class Solution { public:vector<string> restoreIpAddresse…

1051 復數乘法 (15 分)

復數可以寫成 ( 的常規形式&#xff0c;其中 A 是實部&#xff0c;B 是虛部&#xff0c;i 是虛數單位&#xff0c;滿足 1&#xff1b;也可以寫成極坐標下的指數形式 (&#xff0c;其中 R 是復數模&#xff0c;P 是輻角&#xff0c;i 是虛數單位&#xff0c;其等價于三角形式 (。…