【问题标题】:Base class constructor not running基类构造函数未运行
【发布时间】: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


【解决方案1】:

在 GCC 版本 4.6 上我得到了这个

Base    constructor
Derived constructor
Member  constructor
****
Derived Destroyed
Member  Destroyed  
Base    Destroyed  

所以它似乎工作了

顺便说一句,你的基础析构函数应该是虚拟的

 virtual ~ID(){}

这样,当您只有对派生的基础的引用时,仍然会被完全删除。

附带说明,除非你也有,否则请不要使用这样的定义,将 mem 包装在一个智能点中也是一个好主意。就像 c++98 中的 auto_ptr(理想情况下是 boost ptrs)或 c++11 中的 unique_ptr。

【讨论】:

  • 这是最好的答案,因为没有人知道问题是什么。
猜你喜欢
  • 2015-05-31
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-19
  • 2018-07-21
  • 1970-01-01
相关资源
最近更新 更多