Поведение QMetaObject в конструкторе базового класса - PullRequest
2 голосов
/ 24 февраля 2011

У меня есть простой объект, полученный из QObject:

class MyObject : public QObject {
Q_OBJECT
public:
    MyObject(QObject* parent = 0);
};

MyObject::MyObject(QObject* parent) : QObject(parent) {
    std::cout<<"[BASE] "<<this->metaObject()->className()<<std::endl;
}

И я дополнительно получаю этот объект:

class MyDerivedObject : public MyObject {
Q_OBJECT
public:
    MyDerivedObject(QObject* parent);
};

MyDerivedObject::MyDerivedObject(QObject* parent) : MyObject(parent) {
    std::cout<<"[DERIVED] "<<this->metaObject()->className()<<std::endl;
}

Всякий раз, когда я создаю экземпляр этого класса, я получаю следующий вывод:

MyDerivedObject y;

## OUTPUT ###
[BASE] MyObject
[DERIVED] MyDerivedObject

Я не понимаю.Поскольку иерархия наследования имеет вид MyDerivedObject -> MyObject -> QObject, они оба имеют один и тот же экземпляр QObject в качестве родителя (верно?).Я знаю, что большая часть информации о типах во время выполнения предоставляется через moc , но это не должно изменить тот факт, что как только я сделаю static_cast<QObject*>(/*MySomeObject*/) для указателя на один из этих объектов, онито же самое (даже в памяти), если речь идет о функциональности QObject.Тогда почему я получаю разные возвращаемые значения className()?В любом случае, как мне получить имя типа, к которому фактически относится QObject?

1 Ответ

2 голосов
/ 24 февраля 2011

Я не уверен в деталях, но у каждого класса, производного от QObject, есть своя копия структуры мета-объекта:

MyDerivedObject y;

qDebug() << (void*) y.metaObject();
qDebug() << (void*) y.MyObject::metaObject();

, которая дает вам 2 разных указателя на мета-объект.Изменить: я не уверен, что ваш второй вопрос.Но если вы хотите узнать, является ли QObject производным от заданного имени класса, используйте QObject :: inherits () , чтобы узнать.

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