如何向上转换`QPointer<descendant>`

问题描述 投票:0回答:1

我已经声明了一个类

B
,以及一个后代类
D
。 我也有一个方法:

myMethod(QPointer<B> param1) {}

当我尝试使用

myMethod()
QPointer
作为参数调用
D
时,编译器会抱怨:

无法将 'QPointer' 转换为 'QPointer'

为什么抱怨? 我认为传递

QPointer<D>
会隐式地将其向上转换为
QPointer<B>
。 我该如何解决这个问题?

c++ qt upcasting qpointer
1个回答
0
投票

QPointer<T>
是一个受保护的指针,其中
T
must 源自
QObject
(参见 here)。这里的“受保护”只是意味着它可以是 nullptr 或指向合法的 QObject,即尚未销毁的对象,不涉及引用计数,使用框架状态。

从 Qt 6.6 开始,定义了有助于强制转换的构造函数

template <typename X, QPointer<T>::if_convertible<X> = true> 
QPointer::QPointer(QPointer<X> &&other)

template <typename X, QPointer<T>::if_convertible<X> = true> 
QPointer::QPointer(const QPointer<X> &other)

如果没有发生这种情况,则意味着您的

X
无法转换为
T
,例如不相关或者您以某种方式使用了多重继承等。一般情况下,强制转换为
QPointer<QObject>
始终应该有效,Qt 不支持来自
QObject
的多重或虚拟继承。

在大多数情况下,定义为

QPointer<B> param1
的参数对于转换和复制指针包装器来说是无用的浪费时间,对于单线程,可以废除它并可以使用内部
qobject_cast
或 Qt 测试宏。无法真正保证对象不会被销毁,并且会就地创建相同类型的new对象,据我所知,它只能保证指针包含“正确”的、安全解引用的值。对于多线程使用有时,您可能需要一个引用计数拥有指针
QSharedPointer

© www.soinside.com 2019 - 2024. All rights reserved.