多態(tài)
字面意思是多種狀態(tài)。在多態(tài)里涉及兩個定義。
- 覆蓋:即子類繼承父類的同時重寫了父類的函數(shù),從而使父類中的同名函數(shù),以子類重寫的為準。前提條件,父類對應的函數(shù)為虛函數(shù)。
- 隱藏:即子類繼承父類的同時重寫了父類的函數(shù),但是父類中的同名函數(shù),依然存在。只是子類默認調用的是重寫的函數(shù)。但是父類的函數(shù)還是存在的,可以以別的方式調用。前提:父類對應的函數(shù)非虛函數(shù)。
多態(tài)的本質:在一個類中創(chuàng)建虛函數(shù)后,會產生一個虛表,虛表中存儲者虛函數(shù)的地址,當重寫虛函數(shù)時,虛表的地址會發(fā)生改變。
下面我寫了一個簡單的demo
#include<iostream>
using namespace std;
class CAnimal
{
public:
virtual void Description();
void Feature();
};
class CBird:public CAnimal
{
public:
void Description();
void Feature();
};
int main()
{
CAnimal animal;
CBird bird;
CAnimal *panimal = NULL;
panimal = &animal;
panimal->Description();
panimal->Feature();
cout << "........................................." << endl;
panimal = &bird;
panimal->Description();
panimal->Feature();
cout << "........................................." << endl;
animal.Description();
animal.Feature();
cout << "........................................." << endl;
bird.Description();
bird.Feature();
cout << "........................................." << endl;
getchar();
getchar();
return 0;
}
void CAnimal::Description()
{
cout << "動物" << endl;
}
void CAnimal::Feature()
{
cout << "我是有生命的" << endl;
}
void CBird::Description()
{
cout << "鳥兒" << endl;
}
void CBird::Feature()
{
cout << "我是有生命的鳥兒,我會飛" << endl;
}
執(zhí)行結果如下:
動物
我是有生命的
.........................................
鳥兒
我是有生命的
.........................................
動物
我是有生命的
.........................................
鳥兒
我是有生命的鳥兒,我會飛
.........................................
用GDB調試查看虛表結果如下圖所示:

1.png

2.png

3.png