如何知道一个类是否继承了其他抽象类?

Bob*_*bur 2 c++ qt

我有一个Draggable继承的抽象类QWidget.其他两个类继承Draggable:

             QWidget
                |
            Draggable (abstract)
              /   \
             /     \
          Class1  Class2
Run Code Online (Sandbox Code Playgroud)

在主窗口中,在鼠标按下事件时,我想知道被点击的孩子是否Draggable:

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    QWidget *childWid = childAt(event->pos());
    if (!childWid)
        return;

    // if Draggable is not abstract I can do as below
    /*
    Dragable *obj = new Dragable;
    if (!childWid->metaObject()->inherits(obj->metaObject()))
        return;
    */
}
Run Code Online (Sandbox Code Playgroud)

我可以通过比较childWid->metaObject()->className()来检查Class1,Class2但是Draggable有很多孩子.所以我想知道如何判断孩子是否继承了Draggable

vah*_*cho 6

另一种方法是使用qobject_cast函数,它类似于dynamic_cast,但仅适用于QObjects.使用qobject_castvs 的好处dynamic_cast是前者即使禁用RTTI也能工作.

前提条件是你的Draggable类应该QObject直接或间接地继承,它实际上是继承,并用Q_OBJECT宏声明.即

class Draggable : public QWidget
{
    Q_OBJECT
[..]
};
Run Code Online (Sandbox Code Playgroud)

在你的例子中:

void MainWindow::mousePressEvent(QMouseEvent *event)
{
    QWidget *childWid = childAt(event->pos());
    if (!childWid)
        return;

    // if Draggable is not abstract I can do as below
    if (!qobject_cast<Draggable *>(childWid))
    {
        // Not a Draggable
        return;
    }
}
Run Code Online (Sandbox Code Playgroud)