1

我有一个模板列表说,

List<SuperClass*>* mList;

for(int i = 0;i < mList->ElementsCount();i++)
    mList->DeleteElementAtIndex(i);

在 mList 中添加了子类的对象。

在从列表中删除对象时,我是否需要将对象转换为相应的子类并调用 delete 方法?

4

1 回答 1

3

不,在没有显式转换的情况下对每个指针调用delete运算符就足够了,但是您必须确保将类层次结构中类的析构函数声明为virtual(仅将基类中的一个标记为这样就足够了)。这样,对析构函数的调用将是一个虚调用,因此会调用正确的析构函数。

如果您不将析构函数声明为虚拟,则在调用delete每个指针时,将调用基类的析构函数而不是正确的析构函数;这就是为什么在没有virtual析构函数的情况下拥有类层次结构几乎总是被认为是错误的原因。

更多信息可以在C++ FAQ Lite的相关条目中找到。

顺便说一句,该列表似乎不是 STL 列表 ( std::list),如果是这样,您应该从问题中删除 STL 标记。

于 2010-09-22T10:41:49.390 回答