我有一个模板列表说,
List<SuperClass*>* mList;
for(int i = 0;i < mList->ElementsCount();i++)
mList->DeleteElementAtIndex(i);
在 mList 中添加了子类的对象。
在从列表中删除对象时,我是否需要将对象转换为相应的子类并调用 delete 方法?
我有一个模板列表说,
List<SuperClass*>* mList;
for(int i = 0;i < mList->ElementsCount();i++)
mList->DeleteElementAtIndex(i);
在 mList 中添加了子类的对象。
在从列表中删除对象时,我是否需要将对象转换为相应的子类并调用 delete 方法?
不,在没有显式转换的情况下对每个指针调用delete
运算符就足够了,但是您必须确保将类层次结构中类的析构函数声明为virtual
(仅将基类中的一个标记为这样就足够了)。这样,对析构函数的调用将是一个虚调用,因此会调用正确的析构函数。
如果您不将析构函数声明为虚拟,则在调用delete
每个指针时,将调用基类的析构函数而不是正确的析构函数;这就是为什么在没有virtual
析构函数的情况下拥有类层次结构几乎总是被认为是错误的原因。
更多信息可以在C++ FAQ Lite的相关条目中找到。
顺便说一句,该列表似乎不是 STL 列表 ( std::list
),如果是这样,您应该从问题中删除 STL 标记。