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 回答
2
int main(void)
{  
    derived d();     //here you are actually declaring a function
    return 0; 
} 

你应该这样做:

derived d;

然后它将起作用。

于 2013-07-23T10:12:01.630 回答
2

这是因为derived d()被视为“函数 d,不带任何参数调用,返回派生实例”。谷歌“最令人头疼的解析”。

于 2013-07-23T10:10:48.487 回答
1

在 C++ 中,编译器在调用函数之前,必须知道该函数。您需要在调用之前在流程中编写函数,或者至少应该在调用函数之前声明它。因此,通过调用derived d()您已经声明了一个d()以返回类型作为派生对象调用的函数,您从未创建过derived对象。应该是这样的,

int main() {
   derived d;
   return 0

}
于 2013-07-23T10:20:15.143 回答