删除和释放QGraphicsItem类派生对象
Deleting and freeing QGraphicsItem class derived objects
我已经从QGraphicsItem
类派生和绘制一些自定义形状。然后将这些多个形状添加到QGraphicsScene
中。
class StairCurve : public QObject, public CurveShape, public QGraphicsItem
class BezierCurve: public QObject, public CurveShape, public QGraphicsItem
CurveShape
类具有与这些曲线相关的一些常见性质,如ID等。它不是从别的东西推导出来的。它有一些pure virtual
功能。
为了从场景中删除所有的bezier,我正在做这样的事情:
QList<QGraphicsItem*> all = selectedItems();
for (int i = 0; i < all.size(); i++)
{
QGraphicsItem * item = all[i];
if( NULL != item && (BezierCurve::Type == item->type()) )
{
removeItem(item);
delete item;
item = NULL;
}
}
QGraphicsItem * item = all[i];
将返回指向对象基类部分的指针。所以对我来说,删除它看起来很好。此对象将不再是场景的一部分。
我担心的是在item
上调用delete
将调用基类上的析构函数,对吗?我不认为它会把整个物体从记忆中移除。这样做会更有意义吗?
delete dynamic_cast<BezierCurve*>(item);
更正式,
Class A : public B, public C
Class B : public D
A *a;
要删除对象a
,正确的方法是在a
上使用delete
操作符,而不是在层次结构中的任何基类对象上,正确吗?
virtual destructors
的使用是否以任何方式与所有这些有关?
QGraphicsItem
有虚析构函数。因此,如果调用delete item;
,其中item
是QGraphicsItem
类型的指针,则首先调用所有派生类的析构函数。要测试这一点,只需实现StairCurve
类的析构函数,看看它是否被调用。
相关文章:
- 为什么此派生对象无法访问基类的后递减方法?
- 如何在新的派生对象中获取基本对象的数据?
- 如何将成员函数作为参数传递并在派生对象上执行方法列表
- 在没有默认构造函数的情况下创建的派生对象
- OOP 标识派生对象
- 如何创建派生对象的向量?
- 将基类分配给派生对象,反之亦然,以C++以及静态和动态对象之间的差异
- 如何从 Gtk::窗口调用派生对象的析构函数
- 无法在派生对象上运行虚拟函数
- 尝试删除指向派生对象的基指针时断言错误
- 存储在一个通用容器中的派生对象.如何避免铸造
- 将派生对象分配给函数内的基类指针
- 替换派生对象向量中的对象"no matching function to call"
- 派生对象调用的 Base 方法的模板推导
- 用于填充 Base 和派生对象的 shared_ptr 向量的函数模板
- C++ UBSAN 对派生对象产生误报
- 如何验证我是否正在使用C++中的基对象或派生对象
- C++ 构造函数和派生对象
- 将派生对象传递给模板
- 指向派生作品的基本指针,即使派生对象不存在