C++ 函式隱藏
阿新 • • 發佈:2019-02-05
只有基類成員函式的定義已宣告virtualkeyword,當在派生類中的時間,以支付功能實現,virtualkeyword可以從時間被新增以增加。它不影響多狀態。
easy混淆視聽,掩蓋:
,規則例如以下:
1) 假設派生類的函式與基類的函式同名,可是引數不同。
此時,不論有無virtualkeyword,基類的函式將被隱藏(注意別與過載混淆)。
2) 假設派生類的函式與基類的函式同名。而且引數也同樣,可是基類函式沒有virtualkeyword。
此時,基類的函式被隱藏(注意這樣的情況與函式過載的差別,過載發生在同一個類中。
)。
#include<iostream> using namespace std; class Base { public: virtual void f(float x) { cout<<"BASE::f"<<x; } virtual void g(float x) { cout<<"BASE::g"<<x; } void h(float x) { cout<<"BASE::h"<<x; } }; class Driver:public Base { public: void f(float x) { cout<<"d::f"<<x; } virtual void g(int x) { cout<<"d::g"<<x; } void h(float x) { cout<<"d::h"<<x; } }; int main(int argc, char const *argv[]) { Driver d; Base* pb=&d; Driver* pd=&d; pd->f(1.2f); pb->f(1.2f); pd->g(1.2f); pb->g(1.2f); pd->h(1.2f); pb->h(1.2f); return 0; }
請大家注意,f()函式屬於覆蓋,而g()與h()屬於隱藏。從上面的執行結果,我們能夠注意到在覆蓋中。用基類指標和派生類指標呼叫函式f()時。系統都是執行的派生類函式f(),而非基類的f()。而在隱藏方式中,用基類指標和派生類指標呼叫函式g()、h()時,系統會進行區分,基類指標呼叫時,系統執行基類的g()、h(),而派生類指標呼叫時,系統“隱藏”了基類的f(),執行派生類f(),這是“藏”起源。