通过基类的 ptr 调用派生类的方法

Call a derived class's method through the base class's ptr

本文关键字:派生 方法 调用 ptr 基类      更新时间:2023-10-16

我创建了一个新类(继承自QMdiSubWindowQMdiSubWindowMod)来传递指针数组抛出一个窗口(每个窗口都有不同的指针数组)。然后,我设置这个指针数组没有任何问题,因为我在创建QMdiSubWindowMod之后就设置了它。

我的问题是,我想把对象的一些属性改成这些数组,所以我需要通过QMdiAreaactiveSubWindow()调用QMdiSubWindowMod方法,而这个方法实际上返回了QMdiSubWindow对象的指针,而我不能通过QMdiSubWindow对象的这个指针调用我的QMdiSubWindowMod方法
我如何通过QMdiSubWindow的指针调用我的方法,或者你有什么技巧可以让它工作?提前感谢您的回答。

QMdiSubWindowMod.h:

#include <QtWidgets/QtWidgets>
#include "qcustomlabel.h"
class QMdiSubWindowMod : public QMdiSubWindow
{
Q_OBJECT
public:
    explicit QMdiSubWindowMod(QWidget * parent = 0, Qt::WindowFlags flags = 0);
    void setList(QCustomLabel list[80]);
    QCustomLabel* list();
    ~QMdiSubWindowMod();
private:
    QCustomLabel m_list[80];
};

QMdiSubWindowMod.cpp:

#include "qmdisubwindowmod.h"
QMdiSubWindowMod::QMdiSubWindowMod(QWidget * parent, Qt::WindowFlags flags)
    : QMdiSubWindow(parent, flags)
{
}
QMdiSubWindowMod::~QMdiSubWindowMod()
{
}
QCustomLabel* QMdiSubWindowMod::list()
{
    QCustomLabel *list = new QCustomLabel[80];
    for (int i = 0; i < 80; i++) list[i] = m_list[i];
    return list;
}
void QMdiSubWindowMod::setList(QCustomLabel list[80])
{
    for(int i=0; i<80; i++)
    {
        m_list[i] = list[i];
    }
}

当我写论点时(我在这里没有任何问题):

QMdiSubWindowMod *onglet = new QMdiSubWindowMod(m_mainArea);
onglet->setList(list);

我需要读取方法(.cpp)的位置:

QCustomLabel *list[80];
QMdiSubWindowMod *onglet = m_mainArea->activeSubWindow(); //Problem here because of the type of return which is a QMdiSubWindow and not a QMdiSubWindowMod
QMdiSubWindowMod *onglet = static_cast<QMdiSubWindowMod*>( m_mainArea->activeSubWindow() );

这假设您在编写代码时知道返回的对象将具有正确的运行时类型。如果可能得到错误的对象,那么应该使用dynamic_cast,然后测试该强制转换的结果。