派生類希望基類重載函數可見,情況有三種:
a)派生類中覆蓋某個版本,則某個版本可見,全部都覆蓋重寫,則全部版本可見。
b)派生類中一個也不覆蓋,則全部基類版本可見。
c)派生類需要添加新的重載版本,同時又需要可見基類的重載版本,此時並不是必須全部覆蓋重寫全部版本。可在派生類中用using聲明基類重載的函數。
說明:對派生類沒有重新定義的重載版本的訪問實際上是對using聲明點的訪問。
兩種注意點:
a)指向派生類的基類指針或引用,不可調用派生類中的重載函數。
原因:靜態編譯名字查找先於類型檢查,在基類中找到同名函數,就不喊在派生類中繼續找,而基類不存在目標調用形式的函數
b)若不用using聲明基類的重載版函數,派生類對象不可調用基類的重載版本。
原因:派生類的函數,隱藏了基類的同名函數。
h---------------------- #ifndef DEMOCLASS_H #define DEMOCLASS_H #include <iostream> using namespace std; class DemoClass { public: DemoClass(); void func(int); void func(char); }; class DerivedClass:public DemoClass { public: using DemoClass::func; void func(string); }; #endif // DEMOCLASS_H cpp--------------------------- #include "democlass.h" DemoClass::DemoClass() { cout<<"construct..."<<endl; } void DemoClass::func(int) { cout<<"DemoClass func(int)..."<<endl; } void DemoClass::func(char) { cout<<"DemoClass func(char)..."<<endl; } void DerivedClass::func(string) { cout<<"DerivedClass func(string)..."<<endl; } main---------------------- #include <QCoreApplication> #include "democlass.h" int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); DemoClass *demo; DerivedClass derived; demo = &derived; cout<<"...Demo object that point to Derived access func..."<<endl; demo->func(1); demo->func('a'); cout<<endl<<"...derived object access func..."<<endl; derived.func(1); derived.func('a'); derived.func("abc"); return a.exec(); } 運行結果-------------------- construct... ...Demo object that point to Derived access func... DemoClass func(int)... DemoClass func(char)... ...derived object access func... DemoClass func(int)... DemoClass func(char)... DerivedClass func(string)...