#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;
}
为什么在这个程序中它没有调用构造函数?
任何人都可以解释一下吗? .......
答案 0 :(得分: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?中查看有关变量初始化的更多信息。
答案 1 :(得分:4)
试试这样:
int main(void) {
derived d;
return 0;
}
当您键入derived d()
时,您正在声明一个函数而不是创建对象。
答案 2 :(得分:3)
宣言不适合derived d();
将其更改为:
int main(void)
{
derived d; // note the difference
return 0;
}
你在做什么 - &gt; derived d()
,它声明了一个函数。 返回派生类的实例。
答案 3 :(得分:2)
这是因为derived d()
被视为“函数d,在没有任何参数的情况下调用,返回派生的实例”。谷歌“最令人烦恼的解析”。
答案 4 :(得分:2)
int main(void)
{
derived d(); //here you are actually declaring a function
return 0;
}
你应该这样做:
derived d;
然后它会起作用。
答案 5 :(得分:1)
在C ++中,在编译器调用函数之前,它必须知道该函数。您需要在调用之前在流中编写函数,或者至少应该在函数调用之前声明它。因此,通过调用derived d()
,您已声明一个名为d()
的函数,其返回类型为派生对象,您从未创建derived
对象。应该是这样的,
int main() {
derived d;
return 0
}