的多態(tài)如何在編譯和運(yùn)行期實(shí)現(xiàn)?
首先要明確什么是多態(tài):
多態(tài)就是一個(gè)名字或符號(hào)具有多種含義,通過(guò)重載來(lái)實(shí)現(xiàn)。有函數(shù)重載和運(yùn)算符重載兩種。
編譯是靜態(tài)的,函數(shù)重載是靜態(tài)多態(tài)性的具體示例,代碼在編譯完就已經(jīng)決定出同一個(gè)接口用哪種實(shí)現(xiàn),這就是編譯期多態(tài)。
運(yùn)行時(shí)多態(tài)的,虛函數(shù)是動(dòng)態(tài)多態(tài)性的具體示例。直到程序運(yùn)行時(shí),拿到CPU寄存器里的指針了,才知道這個(gè)指針究竟指向父類還是繼承類的虛函數(shù)實(shí)現(xiàn),這就是運(yùn)行期的多態(tài)了。
也就是說(shuō),普通的成員函數(shù),在編譯時(shí)調(diào)用關(guān)系就已經(jīng)確定了,而虛函數(shù),需要在運(yùn)行時(shí),才能根據(jù)對(duì)象指針指向的是父類還是繼承類,來(lái)決定調(diào)用哪一個(gè)實(shí)現(xiàn),我們看看下面的類定義:
class father
{
virtual testVfunc(){
std::cout<<"father testVfunc run"<<std::endl;
}
}
class child : public father
{
virtual testVfunc(){
std::cout<<"child testVfunc run"<<std::endl;
}
定義兩個(gè)對(duì)象:father pFather=new father();
child pChild=new child();這兩個(gè)對(duì)象在內(nèi)存中
有一個(gè)vptl指針,分別指向自己實(shí)現(xiàn)的函數(shù),這樣程序在運(yùn)行到虛函數(shù)時(shí),就會(huì)查找這個(gè)指針具體指向的地址空間,執(zhí)行自己的實(shí)現(xiàn)函數(shù)。
注,泛型是一種特殊形式的靜態(tài)多態(tài),實(shí)現(xiàn)方式是類型參數(shù)化。使用模板機(jī)制的程序設(shè)計(jì)就是泛型編程。