【问题标题】:Can't call destructor from inherited class不能从继承的类调用析构函数
【发布时间】:2012-12-09 21:16:52
【问题描述】:

我有一个抽象类,我从中继承。 为了清楚起见,我在继承器中实现了所有抽象方法。

使用继承类创建的对象后,我试图破坏它,但不是调用继承的析构函数,而是将我发送到抽象方法。

在我的程序中是这样的

class LinkedHash {

private:
      LinkedHashEntry **table;
      int max_size;
public:
      /* Creates a hashtable of size maxSize*/
      LinkedHash(int);
      LinkedHash(){}       
      /* deletes all members of the hashtable */
      virtual ~LinkedHash();

      virtual int hashFunction(int key) = 0;

      void insert(int key, Process* value);

      void remove(int  key);
      int getMaxSize(){return max_size;}
      LinkedHashEntry* search(int x);
};

class LinkedHashinheritor: public LinkedHash {

    public:
        LinkedHashinheritor():LinkedHash(1000){}
        int hashFunction(int key);
};

这是我的cpp文件相关代码:

int LinkedHashinheritor::hashFunction(int key)
{
    return key%1000;
}

还有对相关对象的构造函数和析构函数的调用:

   Scheduler::Scheduler()
{tmp_lh=new LinkedHashinheritor();}

Scheduler::~Scheduler()
{
    delete tmp_lh;
}

【问题讨论】:

  • 您是否为您的基本析构函数提供了实现?您是否为派生类提供了析构函数?
  • 您是否尝试过完全重建您的项目?如果头文件更改(例如,通过向类添加新的虚拟方法)并且包含该头文件的源文件没有被重新编译,有时可能会发生不好的事情。
  • 是的,当然——我的基本析构函数已经实现。我什至没有为我的派生类声明析构函数,它应该由编译器自动调用,不是吗?
  • 您不希望调用基类析构函数吗?如果是这样,那是不正确的期望。
  • 声明派生类析构函数不能解决问题

标签: c++ inheritance destructor


【解决方案1】:

首先要明确这一点:将类抽象化并不会阻止调用其析构函数。继承层次结构中所有类的析构函数将总是被调用(按照从派生类到基类的顺序)。

由于您没有在派生类中声明析构函数,并且编译器提供的析构函数非常简单(例如,它只需要从基类调用析构函数),因此编译器很可能已经优化了派生的析构函数。

【讨论】:

    【解决方案2】:

    注意virtual 析构函数是特殊的virtual 函数:在销毁派生对象时总是调用基类析构函数。构造析构函数virtual 的效果是您可以通过指向基类型的指针delete 派生类型的对象(如果您在析构函数不为virtual 的情况下执行此操作,则会得到未定义的行为。

    【讨论】:

      猜你喜欢
      • 2011-04-04
      • 1970-01-01
      • 2021-03-20
      • 2019-08-26
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      相关资源
      最近更新 更多