基类构造函数未运行

时间:2011-11-26 16:55:50

标签: c++ class inheritance c-preprocessor

#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构造函数不会执行?

1 个答案:

答案 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一样。

相关问题