2013-02-24 28 views
0

我的預期輸出是「bc bvfunc b(1)dc dvfunc」,但我得到了一個像「b(1)dc dvfunc」這樣的輸出。有人能幫我嗎?感謝您寶貴的時間!爲什麼我得到了一個輸出'b(1)dc dvfunc'?

#include<iostream> 

using namespace std; 

class b { 
public: 
    b() { 
    cout<<" bc "; 
    b::vfunc(); 
    } 
    virtual void vfunc(){ cout<<" bvfunc "; } 
    b(int i){ cout<<" b(1) "; } 
}; 

class d : public b { 
public: 
    d(): b(1) { 
    cout<<" dc "; 
    d::vfunc(); 
    } 
    void vfunc(){ cout<<" dvfunc"; } 
}; 

main() 
{ 
    d d; 
} 

回答

1

以獲得所需的輸出需要

d(){b(1);  //move b(1) from initializer list and put it in a constructor. 
    cout<<" dc "; 

僅供參考initializer list用於initialize構造函數調用之前類的成員默認value.Constructor可以覆蓋這些值。

+0

謝謝你.....! – sree 2013-02-24 09:59:31

+2

什麼?!這會創建兩個不同的*'b',一個是'd'的一部分,另一個是臨時存在於構造函數中的臨時變量。幾乎沒有用(除了重現輸出)。 – 2013-02-24 10:12:50

1

在事情完成順序:

d()被調用。這將調用b(1),然後調用構造函數的其餘部分。

所以調用順序是

b(1) 
d() -> which is cout fc, and then cout dvfunc 

B()不會被調用,這樣就不會達到bvfunc。 b()和b(int i)都是獨立的構造函數,只有一個會被調用,而不是兩個。

相關問題