无法从继承的类调用析构函数

Can't call destructor from inherited class

本文关键字:调用 析构函数 继承      更新时间:2023-10-16

我有一个抽象类,我从继承。为了说清楚一点——我在继承程序中实现了所有的抽象方法。

在使用了从继承类创建的对象之后,我试图析构它,但它没有调用继承的析构函数,而是将我发送到抽象方法。

在我的程序中是这样的

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;
}

先说明一下:创建一个类抽象并不会使阻止它的析构函数被调用。继承层次结构中所有类的析构函数将始终调用(按照从派生类到基类的顺序)。

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

注意virtual析构函数是特殊的virtual函数:基类析构函数总是在销毁派生对象时调用。构造析构函数virtual的效果是,您可以通过指向基类型的指针delete派生类型的对象(如果您这样做而没有构造函数virtual,则会得到未定义的行为)。