是不是可以不调用父析构函数?

时间:2014-03-15 11:08:23

标签: c++

我得到了一个我无法修改的结构。是否可以提供我的析构函数并使用它而不是给定的析构函数?或者可能定义我的结构,然后在需要时进行类型转换?继承也是一种选择,但是没有设法跳过父析构函数的调用。

//Given struct
struct TA {
  ~TA() {
    delete m_L;
    delete m_R;
  }
  TA* m_L;
  TA* m_R;
};

//What i need
struct TB {
  ~TB() {
    if (m_L) m_L->destroy();
    if (m_R) m_R->destroy();
  }
  void destroy() {
    if (!--nRefernece) delete this;
  }
  int nRefernece;
  TB* m_L;
  TB* m_R;
};

2 个答案:

答案 0 :(得分:5)

没有。如果您不想调用父析构函数,请不要使用继承。

答案 1 :(得分:2)

这是一个肮脏的黑客,但它在你的情况下是有效的:
在从析构函数返回之前,您只需在派生类的析构函数中调用destroy()并将变量m_Lm_R设置为零delete被定义为在传递空指针时不执行任何操作,因此,您已经有效地停用了基类析构函数中的代码。

struct TB : TA {
  ~TB() {
    if (m_L) ((TB*)m_L)->destroy();
    if (m_R) ((TB*)m_R)->destroy();
    m_L = m_R = 0;
  }
  void destroy() {
    if (!--nReference) delete this;
  }
  int nReference;
};