[Interest] qobject_cast

Ch'Gans chgans at gna.org
Thu Apr 20 08:01:58 CEST 2017


On 20 April 2017 at 17:56, Igor Mironchik <igor.mironchik at gmail.com> wrote:
>
>
> 20.04.2017 8:47, Ch'Gans пишет:
>
>> On 20 April 2017 at 17:03, Igor Mironchik <igor.mironchik at gmail.com>
>> wrote:
>>>
>>> Hi,
>>>
>>>
>>> 20.04.2017 7:52, Ch'Gans пишет:
>>>>
>>>> On 20 April 2017 at 16:38, Igor Mironchik <igor.mironchik at gmail.com>
>>>> wrote:
>>>>>
>>>>> Hi,
>>>>>
>>>>> What the benefits of qobject_cast<> on simple static_cast<>? Or there
>>>>> is
>>>>> no
>>>>
>>>> qobject_cast
>>>> - works only on QObject (obviously)
>>>> - returns nullptr if the object cannot be casted to the required type
>>>
>>>
>>> And it can fail if QObject derived pointer was returned from plugin.
>>
>> Is this a statement or a question?
>>
>> if I'm not wrong, qobject_cast relies on QMetaObject
>> (object->metaObject() and Class::staticMetaObject()).
>>
>> Actually, i've just checked the sources and qobject_cast<T*>(object)
>> returns "static_cast<T*>(T::staticMetaObject().cast(object))" and
>> QMetaObject::cast(obj) returns "(obj &&
>> obj->metaObject()->inherits(this)) ? obj : nullptr"
>>
>> QMetaObject allows you to walk the class inheritance hierarchy, and
>> inherits() does exactly this.
>> I don't think that the fact that the object comes from a plugin can
>> make inherits() fail.
>> If you are able to load the plugin successfully, it means that you
>> have no unresolved symbols.
>
>
> Exactly! qobject_cast<> will fail.
>
> Look in application you have:
>
> class Channel
>   :  public QObject
> {};
>
> In plugin you have:
>
> class MyChannel
>   :  public Channel
> {};
>
> Channel * create();
>
> In application you call:
>
> Channel * ch = create();
>
> And use this object in your application.
>
> Then in one slot in application you can have:
>
> void mySlot()
> {
>   Channel * ch = qobject_cast< Channel* > ( sender() );
>   // You are 100% sure that sender() is Channel!!!
>   // And this cast will fail!!!

Try to call dumpObjectInfo(sender());

Chris

>
> }
>
>>
>> AFAIK, the only problems with plugins is meta-type registration that
>> has to be done explicitly by calling qRegisterMataType(...);
>> I don't think that QMetaObject suffers from this. Maybe someone can
>> confirm this.
>>
>>>> - doesn't relies on RTTI, and is way faster than dynamic cast
>>>
>>>
>>> This is understandable. But with comparison with static cast there are no
>>> benefits?
>>
>> My point was: dynamic_cast is safer than static_cast, and qobject_cast
>> is faster than dynamic_cast.
>>
>> So qobject_cast is a "double win" over static_cast and dynamic_cast.
>>
>> Chris
>>
>>>
>>>> Chris
>>>>
>>>>> one?
>>>>>
>>>>> _______________________________________________
>>>>> Interest mailing list
>>>>> Interest at qt-project.org
>>>>> http://lists.qt-project.org/mailman/listinfo/interest
>>>
>>>
>



More information about the Interest mailing list