1. 程式人生 > >成員函式的過載、覆蓋與隱藏(詳細)

成員函式的過載、覆蓋與隱藏(詳細)

成員函式的過載、覆蓋與隱藏

成員函式的過載、覆蓋(override)與隱藏很容易混淆,C++程式設計師必須要搞清楚概念,否則錯誤將防不勝防。

過載與覆蓋

成員函式被過載的特徵:

(1)相同的範圍(在同一個類中)
(2)函式名字相同
(3)引數不同
(4)virtual 關鍵字可有可無

覆蓋是指派生類函式覆蓋基類函式,特徵是:

(1)不同的範圍(分別位於派生類與基類)
(2)函式名字相同
(3)引數相同
(4) 基類函式必須有virtual 關鍵字

示例2-1 中

  • 函式Base::f(int) 與 Base::f(float)相互過載

  • 而Base::g(void) 被 Derived::g(void)覆蓋

#include <iostream.h>
class Base
{
public:
void f(int x)    { cout << "Base::f(int) " << x << endl; }
void f(float x)    { cout << "Base::f(float) " << x << endl; }
virtual void g(void)    { cout << "Base::g(void)"
<< endl;} }; class Derived : public Base { public: virtual void g(void) { cout << "Derived::g(void)" << endl;} }; void main(void) { Derived d; Base *pb = &d; pb->f(42); // Base::f(int) 42 pb->f(3.14f); // Base::f(float) 3.14 pb->g(); // Derived::g(void) } 示例2-1 成員函式的過載和覆蓋

令人迷惑的隱藏規則

這裡“隱藏”是指派生類的函式遮蔽了與其同名的基類函式
規則如下:

(1)如果派生類的函式與基類的函式同名,但是引數不同

    此時,不論有無virtual關鍵字,基類的函式將被隱藏(注意別與過載混淆)。
(2)如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual關>鍵字。

    此時,基類的函式被隱藏(注意別與覆蓋混淆)。

示例程式2-2(a)中:

  • (1)函式Derived::f(float) 覆蓋了 Base::f(float)
  • (2)函式Derived::g(int) 隱藏了 Base::g(float),而不是過載
  • (3)函式Derived::h(float) 隱藏了 Base::h(float),而不是覆蓋
#include <iostream.h>
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; }
};

示例2-2(a)成員函式的過載、覆蓋和隱藏
示例2-2(b)中,pb 和pd 指向同一地址,按理說執行結果應該是相同的,可事實並非這樣。

void main(void)
{
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
}

示例2-2(b) 過載、覆蓋和隱藏的比較

擺脫隱藏

隱藏規則引起了不少麻煩。

  • 示例2-3 程式中,語句pd->f(10)的本意是想呼叫函式Base::f(int),但是Base::f(int)不幸被Derived::f(char *)隱藏了。

  • 由於數字10不能被隱式地轉化為字串,所以在編譯時出錯。

class Base
{
public:
void f (int x);
};


class Derived : public Base
{
public:
void f (char *str);
};


void Test(void)
{
Derived *pd = new Derived;
pd->f(10); // error
}
示例2-3 由於隱藏而導致錯誤

從示例2-3 看來,隱藏規則似乎很愚蠢。但是隱藏規則至少有兩個存在的理由:

  • 1 寫語句pd->f(10)的人可能真的想呼叫Derived::f(float),只是他誤寫錯了,有了隱藏規則,編譯器就可以明確的指出錯誤,未必是件壞事。

  • 2 假如Derived有多個基類(多重繼承),有時搞不清楚哪些基類定義了函式f。那麼pd->f(10)可能會出乎意料地呼叫了基類函式f。儘管隱藏規則看起來不怎麼有道理,但是能明確的消除這些意外

相關推薦

成員函式過載覆蓋隱藏詳細【轉】

(轉自:https://blog.csdn.net/weixin_42205987/article/details/81569744) 成員函式的過載、覆蓋與隱藏 成員函式的過載(overload)、覆蓋/重寫(override)與隱藏/重定義(hide)很容易混淆,C++程式設計師必須要搞

成員函式過載覆蓋隱藏詳細

成員函式的過載、覆蓋與隱藏 成員函式的過載、覆蓋(override)與隱藏很容易混淆,C++程式設計師必須要搞清楚概念,否則錯誤將防不勝防。 過載與覆蓋 成員函式被過載的特徵: (1)相同的範圍(在同一個類中) (2)函式名字相同

C++中的函式過載覆蓋隱藏

在C++語言中,函式扮演著很重要的角色,不管面向過程設計,還是基於物件設計;不管是面向物件程式設計,還是基於泛型程式設計,函式都可以隨處而見。在談論C++中的函式過載、覆蓋和隱藏之前,先回顧下函式的基礎知識。   函式的宣告包括函式的返回值型別,函式名稱,引數列表(引數的型別、引數的個數、引數的

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

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

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

覆蓋,和隱藏是很不一樣的兩個概念,要重點區分。 過載(overload):同名函式變數,但屬於不同的函式型別。發生在同一個作用域內,即在同一個類中。如果跨類,在父類、子類當中存在同名的函式變數(即便是不同的函式型別),如果是 virtual 性質的,就是過載(也叫繼承,

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

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

轉載:成員函式過載覆蓋隱藏

成員函式的過載(overload)、覆蓋(override)與隱藏很容易混淆,C++程式設計師必須要搞清楚概念,否則錯誤將防不勝防。1 過載與覆蓋成員函式被過載的特徵:(1)相同的範圍(在同一個類中) ;(2)函式名字相同;(3)引數不同;(4)virtual 關鍵字可有可無。覆蓋是指派生類函式

8.2 成員函式過載覆蓋隱藏

成員函式的過載、覆蓋(override)與隱藏很容易混淆,C++程式設計師必須要搞清楚概念,否則錯誤將防不勝防。 8.2.1 過載與覆蓋 成員函式被過載的特徵: (1)相同的範圍(在同一個類中); (2)函式名字相同; (3)引數不同; (4)virtual 關鍵字可有

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

成員函式的過載、覆蓋與隱藏 成員函式的過載、覆蓋(override)與隱藏很容易混淆,C++程式設計師必須要搞清楚 概念,否則錯誤將防不勝防。 8.2.1 過載與覆蓋 成員函式被過載的特徵: (1)相同的範圍(在同一個類中); (2)函式名字相同; (3)引數不同;

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

 成員函式的過載、覆蓋(override)與隱藏很容易混淆,C++程式設計師必須要搞清楚概念,否則錯誤將防不勝防。 成員函式被過載的特徵:(1)相同的範圍(在同一個類中);(2)函式名字相同;(3)引數不同;(4)virtual 關鍵字可有可無。 覆蓋:派生類函式覆蓋基類函式

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

類層次中的同名成員函式,有3種關係:過載overload,覆蓋override和隱藏oversee,hide。 1.成員過載 只有在同一個類中定義的同名成員函式才存在過載關係,主要特點是函式的引數和數目不同,但不能是引數的個數和型別均相同,僅僅依靠返回值的不同來區分函式,和

成員函式過載覆蓋隱藏

基類和派生類類成員函式的過載、覆蓋(override)與隱藏很容易混淆,C++程式設計師必須要搞清楚概念,否則錯誤將防不勝防。 1.過載與覆蓋 成員函式被過載的特徵: (1)相同的範圍(在同一個類中); (2)函式名字相同; (3)引數不同; (4)virtual 關鍵字

C++父類子類關係以及函式過載覆蓋隱藏規則

今天去HTC面試,筆試考了邏輯、c語言、c++語言幾個部分,C/C++考的全是基本語法,沒有考演算法。C語言部分做的還不錯,C++部分卻做的那麼多不確定,其中大部分是C++父子類之間關係以及函式過載、覆蓋以及隱藏規則。 在C++語言中,虛擬函式是非常重要的概念,虛擬函式是

(1) C++:過載覆蓋隱藏

  C++之中的過載、覆蓋、隱藏   過載 覆蓋 過載與覆蓋的區別 相關程式碼 隱藏   過載 過載是指函式不同的引數表,對同名函式的名稱做修飾,然後這些同名函式就成了不同的函式。在同一可訪問區域內被宣告的幾

C++語言特性:建構函式,解構函式,虛擬函式,行內函數,靜態成員函式,過載覆蓋隱藏

C++中class預設屬性為private, struct預設屬性為public 建構函式:        1.初始化物件成員;        2.建立類物件;        由於虛擬函式是建立在物件的基礎上的,因此建構函式不能宣告為虛擬函式;虛擬函式是在執行的時候才識別,

成員函式過載覆蓋隱藏(遮蔽)的區別

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

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

#include <iostream> #include <complex> using namespace std; class Base { public:     virtual void a(int x)    {    cout << "Base::a(int)"

C++中類成員函式過載覆蓋隱藏的區別,超清楚!

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

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

      這是本人第一次寫部落格,主要是想記錄自己的學習過程、心得體會,一是可以方便以後回顧相關知識,二是可以與大家相互學習交流。       關於C++中類成員函式的過載、覆蓋和隱藏區別,第一次看到這個問題是在準備找工作的時候在牛客網中(http://www.nowcoder.com/questionT

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

參考:https://www.nowcoder.com/questionTerminal/266d3a6d4f1b436aabf1eff3156fed951.函式過載的特徵:(1)必須在同一個類中(相同範圍)(2)函式名字必須相同但是函式型別可以不相同(3)引數類表可以不同(