Да:
Так как слоты являются обычными функциями-членами, они следуют нормальному C++ правила, когда вызывается непосредственно. < ...> Вы также можете определить слоты, чтобы быть виртуальными, которые мы нашли довольно полезными на практике .
http://qt-project.org/doc/qt-4.8/signalsandslots.html#slots
В вашем примере Derived::f
нормальная виртуальная функция. Если он вызван напрямую, он работает так, как ожидалось, так же, как говорится в документации. При вызове с помощью сигнала, она вызывается qt_static_metacall
, который генерируется в moc_Derived.cpp
следующим образом:
void Derived::qt_static_metacall(QObject *_o, QMetaObject::Call _c,
int _id, void **_a)
{
if (_c == QMetaObject::InvokeMetaMethod) {
Q_ASSERT(staticMetaObject.cast(_o));
Derived *_t = static_cast<Derived *>(_o);
switch (_id) {
case 0: _t->f(); break;
default: ;
}
}
Q_UNUSED(_a);
}
Таким образом, заканчивается вызовом нормальной функцией _t->f()
.
Обратите внимание, что нет никакого способа вызвать Base::f
сигналом. Эта функция может быть выполнена только в том случае, если данный объект фактически является экземпляром Base
, а не Derived
экземпляром. И так как Base
не основан на QObject, вы не можете передать его экземпляр функции connect
.
По-видимому, по-видимому, существуют разные интерпретации вашего вопроса. Не могли бы вы это немного пояснить, например, добавив пример кода? –
Не имеет значения для вопроса, но вы должны знать, что ['QObject' должен появляться первым в списке базовых классов] (http://qt-project.org/doc/qt-4.8/moc.html#multiple- наследования требует-QObject-к-быть первым). –
@ LucTouraille не соответствует действительности. исправлено. – Vasaka