2013-07-23 90 views
2
#include<iostream> 
using namespace std; 
class base { 
public:  
    base() { 
     cout<<"Constructing base \n"; 
    } 
    virtual ~base() { 
     cout<<"Destructing base \n"; 
    } 
}; 
class derived: public base { 
public:  
    derived() { 
     cout<<"Constructing derived \n"; 
    }  
    ~derived() { 
     cout<<"Destructing derived \n"; 
    } 
}; 
int main(void) { 
    derived d();  
    return 0; 
} 

爲什麼在這個程序中它不是調用構造函數?C++構造函數不調用

任何人都可以解釋嗎?
.......

+1

請意圖您的代碼正確。 – billz

+0

你應該在derived()中調用base()ctor。 derived():base(){cout <<「構造派生」; } – bkausbk

+3

呃...最令人頭疼的解析了。 –

回答

4

嘗試這樣的:

int main(void) { 
    derived d;  
    return 0; 
} 

當你鍵入derived d()你聲明一個函數,而不是創建對象。

+0

或者使用'derived d {};'(C++ 11) – sehe

5

的問題是,您聲明此功能:

// function d(), returns a derived object. 
derived d(); 

你需要的是

derived d; // C++03, C++11 

derived d{}; // C++11 only 

這是C的 「有趣」 的方面++ ,其中任何可以解析爲函數聲明的東西都會(只要它在可以聲明函數的上下文中)。

有關變量初始化的更多信息,請參閱GoTW #1 Variable initialization - or is it?

+0

他會得到一個警告嗎?對於這個 –

+0

我在VS2012中看到過這個警告 –

+0

@GrijeshChauhan我在現在的平臺(GCC的一個古老版本)上沒有收到警告, – juanchopanza

3

宣言不恰當的derived d();

將其更改爲:

int main(void) 
{ 
    derived d;  // note the difference  
    return 0; 
}  

你在做什麼 - >derived d()它聲明的功能。返回派生類的實例。

有關詳細信息,請參閱本:http://en.wikipedia.org/wiki/Most_vexing_parse

2

這是因爲derived d()被視爲「功能d,稱爲不帶任何參數,返回的派生的實例」。谷歌最令人頭疼的解析。

2
int main(void) 
{ 
    derived d();  //here you are actually declaring a function 
    return 0; 
} 

你應該做的是這樣的:

derived d; 

然後它會奏效。

1

在C++中,在編譯器調用函數之前,它必須知道該函數。無論是在調用函數之前需要在函數中寫入函數,還是至少應該在函數調用之前聲明函數。因此通過調用derived d()您已聲明一個名爲d()的函數,返回類型爲派生對象,您從未創建derived對象。它應該是,

int main() { 
    derived d; 
    return 0 

}