C++ 建構函式中呼叫虛擬函式
有這麼一段程式碼:
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
也就是說,在建構函式中呼叫虛擬函式,呼叫的是正在構造的類中的虛擬函式,而不是子類的虛擬函式。
理一下程式。new了一個B物件,首先要呼叫基類建構函式,也就是A類的建構函式。呼叫test(),再呼叫虛擬函式func(),這時候用的是基類版本。之後再呼叫子類B的建構函式,這時呼叫的是子類虛擬函式func()。至於最後一次呼叫func(),根據多型,呼叫的是真實虛擬函式。