我們知道:C++中的多態(tài)使得可以根據(jù)對象的真實類型(動態(tài)類型)調(diào)用不同的虛函數(shù)。這種調(diào)用都是對象已經(jīng)構(gòu)建完成的情況。那如果在構(gòu)造函數(shù)中調(diào)用虛函數(shù),會怎么樣呢?
有這么一段代碼:
class A{public: A ():m_iVal(0){test();} virtual void func() { std::cout<<m_iVal<<‘ ';} void test(){func();}public:int m_iVal;};class B : public A{public: B(){test();}; virtual void func() { ++m_iVal; std::cout<<m_iVal<<‘ ';}};int main(int argc ,char* argv[]){ A*p = new B; p->test(); return 0;}輸出: 0 1 2
也就是說,在構(gòu)造函數(shù)中調(diào)用虛函數(shù),調(diào)用的是正在構(gòu)造的類中的虛函數(shù),而不是子類的虛函數(shù)。
理一下程序。new了一個B對象,首先要調(diào)用基類構(gòu)造函數(shù),也就是A類的構(gòu)造函數(shù)。調(diào)用test(),再調(diào)用虛函數(shù)func(),這時候用的是基類版本。之后再調(diào)用子類B的構(gòu)造函數(shù),這時調(diào)用的是子類虛函數(shù)func()。至于最后一次調(diào)用func(),根據(jù)多態(tài),調(diào)用的是真實虛函數(shù)。
以上就是小編為大家?guī)淼腸++ 構(gòu)造函數(shù)中調(diào)用虛函數(shù)的實現(xiàn)方法全部內(nèi)容了,希望大家多多支持武林網(wǎng)~
新聞熱點
疑難解答