Динамічне приведення типів
Для динамічного приведення QObject використовується функція
T qobject_cast (QObject *object);
Вона працює як стандартна операція dynamic_cast в C++, проте не потребує підтримки зі сторони системи динамічної ідентифікації типів (RTTI).
Нехай у нас є класс MyClass1 , успадкований від QObject і MyClass2 , успадкований від MyClass1 :
#include <QObject>
class MyClass1 : public QObject
{
Q_OBJECT
public:
MyClass1();
// ...
};
class MyClass2 : public MyClass1
{
Q_OBJECT
public:
MyClass2();
// ...
};
Динамічне приведення показує наступний код:
QObject *a = new MyClass2;
MyClass1 *b = qobject_cast<MyClass1*>(a);
MyClass2 *c = qobject_cast<MyClass2*>(b);
Ці операції спрацюють коректно на етапі виконання.
Як у випадку з dynamic_cast , результат приведення можна перевірити:
if (b = qobject_cast<MyClass1*>(a))
{
// ...
}
Система метаоб'єктів дозволяє також перевірити, чи успадковує класс MyClass1 :
if (a->inherits("MyClass1"))
{
b = static_cast<MyClass1*>(a);
// ...
}
Однак перевагу має попередній варіант з qobject_cast .
|