C++學習-對類繼承中同名變數或函式的學習與思考
阿新 • • 發佈:2021-01-03
對類繼承中同名變數或函式的學習與思考
派生類如果有與直接基類同名變數或函式(不論訪問控制關鍵字是否相同),對於同名變數,其會覆蓋直接基類對應的同名變數變數。(下面會講到"覆蓋"一詞並不準確,個人深受其害)
對於同名函式,則覆蓋直接基類對應同名的所有函式,包括所有過載。也就是一個派生類的直接基類和間接基類,它們之間不可能形成函式過載。
如:
#include<iostream> using namespace std; class A { protected: char a='A'; public: void show(char a) { cout<<a; } }; class B:public A { public: void show(int b) { cout<<b; } void show() { cout<<'B'; } }; class C:public B { public: void show() { cout<<'C'; } }; int main() { C c; c.show(2); return 0; }
編譯會出錯。
但是,被覆蓋掉的變數或函式,仍然可以通過作用域解析運算子(::)來呼叫
。如果對以上程式碼的類 C 和 main 函式進行如下改動:
class C:public B { public: void show() { A::show(A::a); cout<<endl; B::show(); cout<<endl; cout<<'C'; } }; int main() { C c; c.show(); return 0; }
則輸出為
A
B
C
所以直接說派生類的同名函式會"覆蓋"基類裡的同名函式不負責任的說法,更確切的說法是"隱藏",因為沒有實際消失。
既然沒有實際消失,如果沒有出現同名隱藏,那麼派生類所繼承的基類中的函式能訪問的成員的永遠只能是它所在的類和它所在類的所有基類(直接基類和間接基類)內的成員,不會出現基類函式訪問派生類成員的情況。
如果虛擬函式同名,我們不考慮虛擬函式和非虛擬函式同時存在於一個類中且同名的情況,實際程式設計用不上(個人想法),所以如果只考慮虛擬函式存在,對於虛擬函式過載,擁有和非虛擬函式一樣的同名隱藏。但是虛擬函式過載中,如果函式原型不完全相同,那麼不能認為給一個函式前面加了virtual所有同名函式(基類和所有派生類中)都是虛擬函式,必須得在每個不同原型首次出現的位置新增virtual。
例子不舉了。
建議瞭解虛擬函式表。