C++中的覆蓋和隱藏
C++中的覆蓋和隱藏,是個令人頭疼的問題,下面寫幾點自己的認識。
首先,參考c++高質量程式設計指南,給出覆蓋的特徵:
覆蓋是指派生類函式覆蓋基類函式,特徵是:
(1)不同的範圍(分別位於派生類與基類);
(2)函式名字相同;
(3)引數相同;
(4)基類函式必須有virtual 關鍵字。
再給出隱藏的特徵:
“隱藏”是指派生類的函式遮蔽了與其同名的基類函式,規則如下:
(1)如果派生類的函式與基類的函式同名,但是引數不同。此時,不論有無virtual
關鍵字,(如果引數相同,基類有virtual,則是覆蓋(按照覆蓋的特徵))基類的函式將被隱藏(注意別與過載混淆)。
(2)如果派生類的函式與基類的函式同名,並且引數也相同,但是基類函式沒有virtual
關鍵字。此時,基類的函式被隱藏(注意別與覆蓋混淆)。
#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; }//覆蓋了基類的f
virtual void f(int x){ cout << "Derived::f(int) " << x << endl; }//隱藏了基類的f
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(覆蓋)OR Base::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;
}
輸出為
若程式碼處像下面這樣的,
class Derived : public Base
{
public:
virtual void f(float x){ cout << "Derived::f(float) " << x << endl; }//覆蓋了基類的f
//virtual void f(int x){ cout << "Derived::f(int) " << x << endl; }//隱藏了基類的f
void g(int x){ cout << "Derived::g(int) " << x << endl; }
void h(float x){ cout << "Derived::h(float) " << x << endl; }
};
則是覆蓋,輸出為:
相關文章
- C++之過載覆蓋和隱藏C++
- C++ 成員函式的過載,繼承,覆蓋和隱藏C++函式繼承
- Performanced C++ 經驗規則(5):再談過載、覆蓋和隱藏ORMC++
- c++中的隱藏及過載、重寫與隱藏的區別C++
- OSX中隱藏和顯示[隱藏檔案]的命令列命令列
- Java方法覆蓋和變數覆蓋的區別詳解Java變數
- 語法:Python中的可覆蓋物件與不可覆蓋物件Python物件
- MAC如何顯示隱藏檔案和隱藏隱藏檔案的命令Mac
- Java中的過載和覆蓋的細微差別 - rajivprabJava
- Mac下顯示和隱藏隱藏檔案的命令Mac
- MacOS X隱藏和顯示隱藏檔案Mac
- Mac顯示和隱藏“隱藏檔案”命令Mac
- Eclipse中的高效程式碼覆蓋Eclipse
- .NET 5 中的隱藏特性
- view的隱藏和顯示View
- 如何在fragment中控制DrawerLayout的顯示和隱藏Fragment
- c++繼承,隱藏(重定義)C++繼承
- 【校園招聘】一道筆試題看c++中virtual覆蓋筆試C++
- Linux中cp覆蓋不提示Linux
- 聊聊React中的隱藏彩蛋功能React
- MySQL 聚簇索引 和覆蓋索引MySql索引
- 區塊的顯示和隱藏
- 淺談C#中重寫和隱藏的區別C#
- 影像隱寫之使用PHP隱藏影像中的文字PHP
- go 中 defer 的一個隱藏功能Go
- MySQL 8.0 中的索引可以隱藏了!MySql索引
- 隱藏域在Ajax中的應用
- 隱藏JqueryMobile中的Header與FooterjQueryHeader
- 網頁中隱藏幀的妙用 (轉)網頁
- Mysql索引覆蓋MySql索引
- 最小圓覆蓋
- 軟體測試培訓之:白盒測試的語句覆蓋法和判定覆蓋法
- C++語言的單元測試與程式碼覆蓋率C++
- javascript隱藏和顯示div的方法JavaScript
- C++“隱藏實現,開放介面”的實現方案C++
- 程式碼覆蓋率與測試覆蓋率比較
- jQuery 效果 – 隱藏和顯示jQuery
- 隱藏資料夾怎麼取消隱藏 關閉隱藏檔案的辦法