无法从继承的类调用析构函数
Can't call destructor from inherited class
我有一个抽象类,我从继承。为了说清楚一点——我在继承程序中实现了所有的抽象方法。
在使用了从继承类创建的对象之后,我试图析构它,但它没有调用继承的析构函数,而是将我发送到抽象方法。
在我的程序中是这样的
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
,则会得到未定义的行为)。
相关文章:
- 什么时候调用析构函数
- C++-明确何时以及如何调用析构函数
- C++ 防止在映射中放置()时调用析构函数
- 调用析构函数以释放动态分配的内存
- C++:使用方法调用析构函数的顺序是什么?
- 向量推回调用析构函数时调用析构函数
- 如何在调用析构函数时优雅地停止/销毁带有阻塞调用C++线程?
- C++,我应该调用析构函数吗?
- 如何获取有关在 Clang LibTooling 中调用析构函数的信息?
- 当我从 std::vector 中的新放置调用析构函数时会发生什么?
- 为什么这里不调用析构函数
- 在调用 std::bind 的产品后意外调用析构函数
- 为什么在传递给函数而不是构造函数时调用析构函数?
- 如何在C++中调用析构函数
- 为什么为未删除的对象调用析构函数?
- 调用析构函数时出错
- C++ 在不释放内存的情况下调用析构函数
- 为什么在运算符删除中不调用析构函数?
- C++ 调用析构函数后动态模板队列"double free or corruption (out)"
- 在 postOrderDelete 上调用析构函数时引发的异常