Как выполнить приведение с множественным наследованием - PullRequest
4 голосов
/ 19 апреля 2011

Моя структура классов выглядит так:

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);

есть ли потенциальный недостаток в моем подходе?

Ответы [ 3 ]

7 голосов
/ 19 апреля 2011

Вы можете сделать это так, как вы представляете, но в этом нет необходимости. Ниже должно работать нормально.

IMethodHelper* myIHelper = dynamic_cast<IMethodHelper*>(someObject);
4 голосов
/ 19 апреля 2011
IMethodHelper * myIHelper = dynamic_cast<IMethodHelper *>(someObject);

Перекрестные броски допустимы с dynamic_cast - если ваши типы полиморфны.

5.2.7 / 8 фрагмент:

Проверка во время выполнения логически выполняется следующим образом: - если, в наиболее производных объект, на который указывает (ссылается) v, v указывает (относится) к общедоступному базовому классу подобъект объекта T, и если только один объект типа T является производным от подобъект указывает (ссылается) на по v, результат является указателем ( lvalue ссылается) на этот объект T.

2 голосов
/ 19 апреля 2011

Просто для дополнения ответов, есть также Q_INTERFACES и Q_DECLARE_INTERFACE, которые позволяют использовать qobject_cast вместо dynamic_cast . Документация рекламирует их в основном для создания плагинов, но их можно использовать в любом проекте.

Они особенно полезны при создании «сервисов». (Например, реализует ли этот класс интерфейс службы com.example.IFileService/1.0?) И, конечно, они работают с отключенным RTTI, если вам когда-либо понадобится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...