1、基于向上類型轉換,基類通過虛函數可以對多個子類相似的功能實現統一管理。
2、例子:
A為基類,B、C為A的同級子類。virtual只需在基類中標識一次,子類無需重復標識。class A
{virtual void display(){cout<<"我是A"<<endl;}
}
class B:public A
{void display(){cout<<"我是B"<<endl;}
}class C:public A
{void display(){cout<<"我是C"<<endl;}
}void display(A s)//以A類型作為參數的頂層函數,不同于類中的成員函數
{s.display();//調用對象s的成員函數
}
int main()
{A x1;B x2;C x3;display(x1);//顯示:我是A。display(x2);//參數x2向上轉換為x1類型,顯示:我是B。display(x3);//參數x3向上轉換為x1類型,顯示:我是C。
}
通過顯示我們注意到以下兩點:1、盡管在頂層函數的定義中是以基類A作為其參數,但卻能接受基類A的任一子類作為其參數。事實上,這是基于自動向上類型轉換,即子類轉換為它的父類型。2、雖然子類轉換成了它的父類型,但卻可正確調用屬于子類而不屬于父類的成員函數。這是虛函數的功勞。這樣,我們通過設計一個以基類型作為參數的頂層函數,就可實現基類及其所有子類相似功能的統一管理,而不用理會不同對象自身的類型。當然你還是可以利用域解析符去調用想要的成員函數,但情況并不總是那么順利。當類層次很多時,你可能都不太記得你創建的對象屬于哪個類型了。