gpt4 book ai didi

c++ - 继承链中间的静态转换

转载 作者:行者123 更新时间:2023-11-28 03:54:08 27 4
gpt4 key购买 nike

假设我们有:

class Component : public QGraphicsItem {
...
virtual void paintMe() = 0;
virtual void doSomething();

virtual bool isComposite() const { return false; }
}

class Composite: public Component {
...
void addChildren(Component *);
void removeChildren(Component *)

bool isComposite() const { return true; }
}

class IconNode: public Composite {
...
void paintMe();
}

class ImageNode: public Composite {
...
void paintMe();
}

问题是:如果我能保证 item总是某个继承 Composite 的类,下面的例子是否安全?

void test (Component *item) {
if (item.isComposite()) {
Composite *comp = static_cast<Composite*>(item);
...
}
...
}

我知道这是一个有点奇怪的例子,因为为了安全我可以使用 dynamic_cast,但我想知道是否可以用 static_cast 来完成。

背景:我在使用 Qt Graphics View Framework 时遇到问题。即,它具有将项目转换为原始类(例如 IconNode -> IconNode、Compsite -> Composite)的函数 T qgraphicsitem_cast ( QGraphicsItem * item ),但它不能转换为继承链中间的类 (IconNode -> Composite) ) 因为它通过使用函数 type() 来识别类,并且因为 IconNode 和 Composite 的 type() 不同,所以转换失败。

这可以通过以下示例解决,但我想知道我之前的示例是否可以安全地完成这项工作:

Composite * castItem (QGraphicsItem *item) {
if (item != 0) {
switch(item.type()) {
case IconNode::Type:
return qgraphicsitem_cast<IconNode*>(item);
case ImageNode::Type:
return qgraphcisitem_cast<ImageNode*>(item);
}
}
return 0;
}

最佳答案

简单的回答是:是的,如果你知道它是什么,你可以安全地static_cast给它。

关于c++ - 继承链中间的静态转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4279072/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com