C ++, почему это возвращается? - PullRequest
0 голосов
/ 17 марта 2019

Я написал класс 'clsFileThread', этот класс является производным от 'clsThread'.'clsThread' является производным от 'QThread'

. В другом классе я написал метод доступа, который возвращает указатель на 'QObject'.В этом методе есть что-то вроде:

QObject* clsScriptHelper::use(QJsonValue strModule) {
    QObject* pobjModule = nullptr;

    if (strModule.toString().compare("fileIO") == 0) {
        pobjModule = new clsFileThread();
    }
    return pobjModule;
}

Когда указатель возвращается, это указатель на 'clsThread', почему?Я бы подумал, что указатель будет иметь тип QObject, затем, используя полиморфизм, я смогу получить доступ к членам и методам выше, но это не так.

То, что я хочу сделать, это получить доступ кметоды 'clsFileThread' через указатель, возвращаемые функцией 'use', но это не работает.

1 Ответ

0 голосов
/ 17 марта 2019

Возвращаемый указатель имеет тип QObject*, хотя сам объект имеет значение clsFileThread* (потому что именно так вы определили метод use). Следовательно, прямой доступ к возвращаемому значению не разрешит доступ к методам clsFileThread.

Наследование классов выглядит так:

clsFileThread > clsThread > QThread > QObject

Если вы хотите получить доступ к возвращаемому объекту, как к clsFileThread, вы можете dynamic_cast вернуть значение, например:

QObject* obj = clsScriptHelper::use(whatever);
clsFileThread* clsFileThreadObject = dynamic_cast<clsFileThread*>(obj);
if (clsFileThreadObject)
{
   clsFileThreadObject->doSomething();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...