如何使用多重继承执行转换

我的类结构如下所示:

class MethodHelper : public QObject, public IMethodHelper {
public:
    // Stuff
};
现在,我得到一个指向对象的指针:
QObject* someObject = getMethodHelper();
在这里,我非常肯定someObject是一种MethodHelper。我不知何故想将它投射到IMethodHelper。我应该怎么做呢? 我目前的想法就像QObject -> MethodHelper -> IMethodHelper一样,如下所示:
QObject* someObject = getMethodHelper();
MethodHelper* myHelper = qobject_cast<MethodHelper*>(someObject);
IMethodHelper* myIHelper = dynamic_cast<IMethodHelper*>(myHelper);
我的方法存在潜在的缺陷吗?
已邀请:

ased

赞同来自:

IMethodHelper * myIHelper = dynamic_cast<IMethodHelper *>(someObject);
如果您的类型是多态的,则交叉演员与dynamic_cast合法。 5.2.7 / 8片段:
The run-time check logically executes as follows: — If, in the most derived object pointed (referred) to by v, v points (refers) to a public base class subobject of a T object, and if only one object of type T is derived from the sub-object pointed (referred) to by v, the result is a pointer (an lvalue referring) to that T object.

tmodi

赞同来自:

你可以按照你提出的方式去做,但没有必要。下面应该工作正常。

IMethodHelper* myIHelper = dynamic_cast<IMethodHelper*>(someObject);

hvelit

赞同来自:

只是为了补充答案,还有Q_INTERFACESQ_DECLARE_INTERFACE允许使用qobject_cast而不是dynamic_cast进行投射。文档广告主要用于构建插件,但它们可用于任何类型的项目。 它们在创建“服务”时特别有用。 (如此,这个类是否实现了服务接口com.example.IFileService/1.0?)当然,如果你需要,它们可以关闭RTTI。

要回复问题请先登录注册