【发布时间】:2011-11-26 16:55:50
【问题描述】:
#define CLASS(ID) class ID{ \
public: \
ID(int) { cout<<#ID <<"\tconstructor"<<endl; } \
~ID(){cout<<#ID<<"\tDestroyed "<<endl;} \
};
CLASS(Base);
CLASS(Member);
class Derived : public Base {
public:
Member *mem;
Derived(int x) : Base(1) {
cout<<"Derived constructor"<<endl;
mem=new Member(2);
}
~Derived()
{
cout<<"Derived Destroyed"<<endl;
delete mem;
}
};
int main(int argc, char** argv) {
Derived * der=new Derived(1);
cout<<"****"<<endl;
delete der;
}
这个的输出是:
Derived constructor
Member constructor
****
Derived Destroyed
Member Destroyed
Base Destroyed
在第二个版本中:
class Derived : public Base {
public:
Member *mem;
Derived(int x) : Base(1) {
cout<<"Derived constructor"<<endl;
}
~Derived()
{
cout<<"Derived Destroyed"<<endl;
delete mem;
}
};
为什么在第一个版本中,当同一个类的实例被实例化时,Base 构造函数不执行?
【问题讨论】:
-
为什么会有这种奇怪的缩进样式?
-
不,肯定不是。
-
你用的是什么编译器?我刚刚将您的代码复制并粘贴到 Microsoft Visual C++ 2010 中,并在第一种情况下执行了
Base构造函数。 -
VS2010,输出如预期(
Base constructor首先显示)。 -
为什么要投反对票?这种行为是不正常的。是的......他没有发布真正的代码比他发现编译器错误更有可能,但是......给他怀疑的好处!
标签: c++ class inheritance c-preprocessor