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