1. 程式人生 > >C++ 類成員函式的過載(overload),重寫/覆蓋(override),隱藏

C++ 類成員函式的過載(overload),重寫/覆蓋(override),隱藏

C++ 類層次中的同名函式,有三種關係:

  • 過載(overload)
  • 重寫、覆蓋(override)
  • 隱藏(hide,oversee)

過載

c++函式過載

  1. 相同的範圍(在同一個類中)
  2. 相同的函式名字,不同的引數列表,與返回值型別沒有關係
  3. virutal關鍵字可有可無

重寫、覆蓋

覆蓋值: 在派生類中覆蓋基類中的同名函式,要求基類函式必須是虛擬函式,且
1. 與基類的虛擬函式有相同的引數列表
2. 與基類的虛擬函式有相同的返回型別: 或者與基類虛擬函式的相同,或者都返回指標(或引用),並且派生類虛擬函式所返回的指標(或引用)型別是基類中被替換的虛擬函式所返回的指標(或引用)型別的子型別(派生型別)

這裡寫圖片描述

class A
{
public:

    virtual void fun(int x)
    {
        cout << "A:" << x << endl;
    }
};

class B: public A // B繼承A
{
public:
    void fun(int x) 
    {
        cout << "B:" << x << endl;
    }
};

int main( )
{
    A *a = new B;
    a->fun(2); // 多型,列印 B:2
return 0; }
class A
{
public:

    void fun(int x)
    {
        cout << "A:" << x << endl;
    }
};

class B: public A // B繼承A
{
public:
    void fun(int x) 
    {
        cout << "B:" << x << endl;
    }
};

int main( )
{
    A *a = new B;
    a->fun(2); // 基類中函式虛擬函式 無多型,列印 A:2
return 0; }

隱藏

隱藏指在某些情況下,派生類中的函式遮蔽了基類中的同名函式,這些情況包括

  • 兩個函式引數相同,但是基類不是虛擬函式。和覆蓋的區別在於基類函式是否是虛擬函式,例如

題1

這裡寫圖片描述

題2

這裡寫圖片描述

  • 兩個函式引數列表不同,無論基類函式是否虛擬函式,基類函式都將被覆蓋。和過載的區別在於兩個函式不在同一個類中
    這裡寫圖片描述

相關推薦

C++基礎】過載overload重寫(覆蓋)override隱藏hide的區別

過載overload 過載是指不同的函式使用相同的函式名,但是函式的引數個數或型別不同。呼叫的時候根據函式的引數來區別不同的函式。 相同的範圍(在同一個類中)函式名字相同引數不同virtual可有可無編譯期繫結,與多型無關 重寫(覆蓋)override 重寫/覆蓋是在在

C++ 成員函式過載(overload)重寫/覆蓋(override)隱藏

C++ 類層次中的同名函式,有三種關係: 過載(overload) 重寫、覆蓋(override) 隱藏(hide,oversee) 過載 c++函式過載 相同的範圍(在同一個類中)

c++函式過載重寫示例

1、檔案cls.h 標頭檔案cls.h實現了基類Base1、Base2,和子類Derived1、Derived2。 #pragma once #include <iostream> us

C++ 過載運算子 運算子過載函式作為成員函式 過載運算子+

用運算子過載函式作為類成員函式的方法過載運算子+ 下面的例子來自於課本: #include <iostream> using namespace std; class Complex {

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

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

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

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

成員函式過載函式指標

在有成員函式過載的情況下該如何使用函式指標呢 class l { public: void func(); void func(int, int); }; void l::func() { cout << "func()" << endl; }

C++----成員函式做友元函式

//成員函式做友元函式: //只讓visit1做building的好朋友(只有visit1能訪問building的私有屬性) class Building; class goodGay { public: goodGay(); void visit1(); void visit2();

當執行緒函式C++成員函式

很多時候我們在C++多執行緒開發時,都會或多或少遇到執行緒函式為C++類中的某個成員函式,此時可能會發生什麼呢?你有可能會雜麼做呢? 接下來我就為大家總結一下我在這方面走過的一個歷程 1.問題一 記得我在之前在寫一個udp傳輸檔案的程式時,我就第一次遇到了

c++成員函式後邊加const是為什麼?

時間是讓人猝不及防的東西,晴是有風陰時有雨,爭不過朝夕,又念著往昔,偷走了青絲卻留住一個你   #include <iostream> #include <string> using namespace std; class Test { pub

C++】成員函式過載二元和一元運算子

過載雙目運算子時,運算子函式中應該具有兩個引數,若運算子函式作為類的成員函式(當運算子過載函式作為類的成員函式時,要求運算元左邊必須是一個物件,而函式的引數可以是同類的物件也可以是普通的變數),則只需要一個引數。 雙目運算子 雙目運算子就是具

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

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

c++ 成員函式內刪除this指標

問題1:成員函式內能不能delete this。 但從編譯來說, 都是可以的。 但從執行中, 又得分情況來看。 1.  解構函式內呼叫delete this。 這是一定不行的, 解構函式內呼叫delete this 可以理解為 函式無終止條件自我遞迴呼叫, 最終導致棧溢位。

c語言呼叫c++成員函式的方法

最近做了一個wav格式的音訊播放器,介面部分用Qt實現,中間層程式碼使用C語言實現,這就涉及到c和c++相互呼叫的問題。 c++呼叫c語言的方法在另一篇文章中已經說明,c呼叫c++的方法現做如下介紹。 音訊播放的時候中間層程式碼需要將音訊的播放進度和狀態等資訊反饋給介面程式

C++成員函式在.cpp中設定成inline後無法解析的問題

行內函數:告知編譯器在進行有內聯標識的函式呼叫時將函式體部分在呼叫處展開。這樣做可以消除函式傳參(堆疊呼叫)的負擔,提高了函式的呼叫效率。 而且inlining的函式並不存在,因為已經被展開了。 如果需要定義一個行內函數,需要在函式體定義的地方使用inline關鍵字標識,

C++成員函式作為回撥函式說起

在網路訊息處理中經常要用到回撥機制。 例如處理非同步網路操作的前攝器設計模式(Proactor),(可以參考 《C++ 網路程式設計 卷2》中關於ACE Proactor模式實現 )。 非同步的 Web 伺服器將這樣來利用前攝器模式:首先讓 Web 伺服器向 OS 發出非同步

C++ 成員函式中的靜態變數的作用域

本來的一個想法是C++ 的類的成員函式是屬於這個類的,那麼這個類的成員函式中的靜態變數也是屬於這個類的。不過越想越感覺不對勁,於是寫了個測試程式碼,試了一下。還真不對,結果是類的成員函式中的靜態變數,他的作用域是這個成員函式,不管是不是這個類的同一個例項化物件,他們都共用

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

其他擴充套件連結: 過載: 成員函式被過載的特徵: 1)相同的範圍:在同一個類中 2)函式名相同,引數不同 3)virtual可有可無 覆蓋: 派生函式覆蓋基類函式 1)位於不同的範圍內(子類

c++知識點----成員函式過載運算子

題目:編寫一個程式,用成員函式過載運算子“+”和“-”將兩個二維陣列相加和減,要求第一個二維陣列的值由建構函式設定,另一個二維陣列的值由鍵盤輸入 用到的檔案 maincpp.cpp #define

C/C++開發語言系列之20---C++成員函式指標2

#include <iostream> #include <string> #include <vector> #include <map> using namespace std; class Foo { public: strin