Унаследовано ли «неявное совместное использование» от классов Qt?

Если я создам подкласс неявно общего класса Qt (например, QList), будет ли мой подкласс также неявно совместно используемым?

Я прочитал краткое введение в неявное совместное использование находится в документации QtCore5.3, но я не видел упоминания о наследуемости.

Моя цель в том, чтобы попытаться написать более эффективный код при принятии решения о том, какие аргументы передавать и как их передавать.


person FalafelPita    schedule 15.09.2014    source источник
comment
Имейте в виду, что QList не имеет виртуального деструктора и поэтому не должен использоваться в качестве (общедоступного) базового класса. Если вы это сделаете, очень легко столкнуться с проблемами UB.   -  person Jens    schedule 16.09.2014
comment
В таких случаях предпочтительнее использовать агрегацию вместо наследование.   -  person Dmitry Sazonov    schedule 16.09.2014


Ответы (1)


Как сказано в комментариях, классы Qt, использующие неявное совместное использование, обычно являются контейнерами данных или инструментами и не предназначены для создания подклассов.
Вы можете заметить, что поскольку виртуального деструктора нет, на самом деле вообще никакой виртуальной функции.

Из-за рисков и плохой практики вы, вероятно, захотите сделать другой дизайн без наследования.


Чтобы ответить на ваш вопрос:

Как работает неявное совместное использование?
Экземпляры класса совместно используют данные и явно сообщают, когда им нужно изменить эти данные (и, таким образом, глубоко скопировать их), вызывая функцию detach().
Таким образом, данные материнского класса по-прежнему будут общим указателем данных, а методы материнского класса по-прежнему будут отсоединяться в соответствующее время. Но элементы данных вашего подкласса не будут неявно использоваться совместно, а методы вашего подкласса не неявно отсоединены, когда это может понадобиться.
Вы также могут перегрузить методы и забыть об отсоединении, что испортит общие данные.

Вы не получаете выгоды от неявного общего доступа, вам нужно явно установить его снова для ваших собственных данных.
Вам нужно будет инкапсулировать данные в контейнер общих данных и управлять detach в ваши методы. Проверьте документ:
http://doc.qt.io/qt-5/qshareddatapointer.html#details

person ymoreau    schedule 05.01.2018