C++類中覆蓋與隱藏一直是一個容易理解出錯的地方,接下來我就詳細講解一下區別在何處
覆蓋指的是子類覆蓋父類函數(被覆蓋),特征是:
1.分別位於子類和父類中
2.函數名字與參數都相同
3.父類的函數是虛函數(virtual)
隱藏指的是子類隱藏了父類的函數(還存在),具有以下特征:
子類的函數與父類的名稱相同,但是參數不同,父類函數被隱藏
子類函數與父類函數的名稱相同,參數也相同,但是父類函數沒有virtual,父類函數被隱藏
class father { public: void show1() { cout << "father::show1" << endl<< endl; } virtual void show2() { cout << "father::show2" << endl << endl; } }; class son:public father { public: void show1() { cout << "son::show1" << endl<< endl; } virtual void show2() { cout << "son::show2" << endl << endl; } };
int main()
{
father f;
son s;
father *pf=&s;
son *ps=&s;
pf->show1();
pf->show2();
return 0;
}
因為show1是非virtual函數,調用它的對象類型為靜態類型即父類(靜態聯編),所以調用的是父類的對象
但是show2為virtual函數,調用它的對象類型為動態類型即指針指向的類型(動態聯編),所以調用的是子類的類型
IF 子類的函數與父類的名稱相同,但是參數不同
父類函數被隱藏
ELSE IF 子類函數與父類函數的名稱相同&&參數也相同&&但是父類函數沒有virtual
父類函數被隱藏
ELSE IF 子類函數與父類函數的名稱相同&&參數也相同&&但是父類函數有virtual
父類函數被覆蓋