我希望为某些对象实现自定义行为。
为此,我的项目(继承自QGraphicsItem)需要实现某些接口。
从外部看,我认为我只需要做
为此,我的项目(继承自QGraphicsItem)需要实现某些接口。
class SomeParentItem
{
SomeParentItem(bool x) { x = true; }
void function1() {}
};
class SomeInterface
{
virtual void function2() = 0;
};
class XYZItem : public QGraphicsXYZItem, public SomeParentItem, public SomeInterface
{
XYZItem(bool x):SomeParentItem(x) {}
virtual void function2() { x = false; }
};
class MPQItem : public QGraphicsMPQItem, public SomeParentItem
{
MPQItem (bool x):SomeParentItem(x) {}
};
从外部看,我认为我只需要做
SomeInterface* item1 = dynamic_cast<SomeInterface*>(item);
if(item1 == NULL)
item->function1();
else
item1->function2();
不幸的是,这往往会导致崩溃...因此我正在创建一个标志来测试,只有当标志为真时才敢强制转换。
但我一直在想,它不应该崩溃。所以我变得勇敢,再次尝试,这次在QWidget子类中进行。与其崩溃,我得到了
QWidget::insertAction: Attempt to insert null action
出现该消息是因为测试条件 if(item1 == NULL)
不成立...
我应该如何正确检查我的对象是否实现了 SomeInterface
接口?
注意:对象 item
不能为空。
item
进行空值测试吗?这似乎是它崩溃的唯一方式。dynamic_cast
是测试对象是否实现接口的常规方法。 - Serge Rogatch