#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构造函数不会执行?
答案 0 :(得分:1)
在GCC 4.6版上我得到了这个
Base constructor
Derived constructor
Member constructor
****
Derived Destroyed
Member Destroyed
Base Destroyed
所以它似乎正在运作
另一方面,你的基础析构函数应该是虚拟的
virtual ~ID(){}
这种方式当你只有你所得到的基数的引用时,仍然会被彻底删除。
另外请注意,除非你有这样的定义,否则请不要使用这样的定义,在智能点上包装内存也是一个好主意。就像c ++ 98中的auto_ptr(理想情况下是boost ptrs)或c ++ 11中的unique_ptr一样。