我有一个抽象类,我正在继承。 为了说清楚 - 我在继承者中实现了所有抽象方法。
在使用继承者类生成的对象之后,我试图破坏它,但不是调用继承的析构函数,而是将它发送给抽象方法。
在我的程序中它看起来像这样
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;
}
答案 0 :(得分:3)
为了清楚地说明这一点:制作一个抽象类不会阻止它的destroctor被调用。继承层次结构中所有类的析构函数将始终被调用(按从派生类到基类的顺序)。
由于您尚未在派生类中声明析构函数,并且编译器提供的析构函数非常简单(例如,它只需要从基类调用析构函数),编译器很可能已经优化了派生的析构函数。
答案 1 :(得分:2)
请注意,virtual
析构函数是特殊的virtual
函数:在销毁派生对象时始终会调用基类析构函数。生成析构函数virtual
的效果是,您可以通过指向基类型的指针delete
派生类型的对象(如果执行此操作而不使用析构函数virtual
,则不会定义行为。