谈谈重载(overload)覆盖(override)与隐藏
這三個(gè)概念都是與OO中的多態(tài)有關(guān)系的。如果單是區(qū)別重載與覆蓋這兩個(gè)概念是比較容易的,但是隱藏這一概念卻使問(wèn)題變得有點(diǎn)復(fù)雜了,下面說(shuō)說(shuō)它們的區(qū)別吧。
???????重載是指不同的函數(shù)使用相同的函數(shù)名,但是函數(shù)的參數(shù)個(gè)數(shù)或類型不同。調(diào)用的時(shí)候根據(jù)函數(shù)的參數(shù)來(lái)區(qū)別不同的函數(shù)。
???????覆蓋(也叫重寫)是指在派生類中重新對(duì)基類中的虛函數(shù)(注意是虛函數(shù))重新實(shí)現(xiàn)。即函數(shù)名和參數(shù)都一樣,只是函數(shù)的實(shí)現(xiàn)體不一樣。
???????隱藏是指派生類中的函數(shù)把基類中相同名字的函數(shù)屏蔽掉了。隱藏與另外兩個(gè)概念表面上看來(lái)很像,很難區(qū)分,其實(shí)他們的關(guān)鍵區(qū)別就是在多態(tài)的實(shí)現(xiàn)上。什么叫多態(tài)?簡(jiǎn)單地說(shuō)就是一個(gè)接口,多種實(shí)現(xiàn)吧。
???????還是引用一下別人的代碼來(lái)說(shuō)明問(wèn)題吧(引用自林銳的《高質(zhì)量C/C++編程指南》)。
仔細(xì)看下面的代碼:
#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; } }; |
看出什么了嗎?下面說(shuō)明一下:
(1)函數(shù)Derived::f(float)覆蓋了Base::f(float)。
(2)函數(shù)Derived::g(int)隱藏了Base::g(float),而不是重載。
(3)函數(shù)Derived::h(float)隱藏了Base::h(float),而不是覆蓋。
???????嗯,概念大概明白了,但是在實(shí)際的編程中,我們會(huì)因此遇到什么問(wèn)題呢?再看下面的代碼:
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
}
在第一種調(diào)用中,函數(shù)的行為取決于指針?biāo)赶虻膶?duì)象。在第二第三種調(diào)用中,函數(shù)的行為取決于指針的類型。所以說(shuō),隱藏破壞了面向?qū)ο缶幊讨卸鄳B(tài)這一特性,會(huì)使得OOP人員產(chǎn)生混亂。
不過(guò)隱藏也并不是一無(wú)是處,它可以幫助編程人員在編譯時(shí)期找出一些錯(cuò)誤的調(diào)用。但我覺(jué)得還是應(yīng)該盡量不要使用隱藏這一些特性,該加virtual時(shí)就加吧。
轉(zhuǎn)載自:
http://blog.csdn.net/yanjun_1982/article/details/470405
轉(zhuǎn)載于:https://blog.51cto.com/7044041/1888232
總結(jié)
以上是生活随笔為你收集整理的谈谈重载(overload)覆盖(override)与隐藏的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 浙江嘉兴“网事”再添国字招牌 领跑城市智
- 下一篇: 专家呼吁建安全漏洞信息共享机制并强化管控