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; 
} 

このプログラムでコンストラクターを呼び出さないのはなぜですか?

誰でも説明できますか?
.......

4

6 に答える 6

5

問題は、ここで関数を宣言していることです。

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

必要なのは

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

また

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

これは C++ の "興味深い" 側面であり、関数宣言として解析できるものはすべて (関数を宣言できるコンテキスト内にある場合) 処理されます。

変数の初期化の詳細については、GoTW #1 変数の初期化を参照してください。それとも? .

于 2013-07-23T10:07:28.493 に答える
4

このようにしてみてください:

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

入力derived d()すると、オブジェクトを作成するのではなく、関数を宣言します。

于 2013-07-23T10:06:56.393 に答える
3

宣言は適切ではありませんderived d();

次のように変更します。

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

あなたがしていること -> derived d()それは関数を宣言します。派生クラスのインスタンスを返します。

詳細については、http: //en.wikipedia.org/wiki/Most_vexing_parseを参照してください。

于 2013-07-23T10:07:51.117 に答える