C++ 構造函數中調用虛函數

我們知道: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(),根據多態,調用的是真實虛函數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章