从基于 class 的 QObject 继承构造函数
Inheriting constructor from QObject based class
我有一个叫做MiscData
的class继承了QObject
并且有一个成员变量(模型)。然后是一堆继承 MiscData
的其他 classes 并重新实现其虚函数来填充模型。所以它看起来像这样:
class MiscData : public QObject
{
Q_OBJECT
public:
explicit MiscData(QObject *parent = 0);
QAbstractItemModel &model();
private:
virtual void loadData() = 0;
private:
QStandardItemModel m_Model;
}
其中一个后代看起来像这样:
class LogData : public MiscData
{
Q_OBJECT
public:
using MiscData::MiscData;
private:
virtual void loadData() override;
}
我知道我必须为 MiscData
使用显式构造函数,因为它会初始化模型成员变量。但是我想知道在派生的 class 中使用 using
指令来继承 MiscData
的构造函数是否安全。
编辑:根据答案,在 MiscData 中使用 using QObject::QObject
似乎也不错。
您可以在初始化列表中调用基础 class' 构造函数。
class LogData : public MiscData
{
Q_OBJECT
public:
explicit LogData(QObject *parent = 0) : MiscData(parent) {};
private:
virtual void loadData() override;
}
其中 MiscData
的构造函数应该以相同的方式将 parent
传递给 QObject
:
class MiscData : public QObject
{
Q_OBJECT
public:
explicit MiscData(QObject *parent = 0) : QObject(parent) {};
QAbstractItemModel &model();
private:
virtual void loadData() = 0;
private:
QStandardItemModel m_Model;
}
如果需要,可以将构造函数的定义移动到 .cpp
文件中。
using
只提供可用的东西,不调用任何东西。
看起来你所做的从 C++11 开始就完全正确了。
见Inheriting constructors and C++11 Object construction improvement。
Note that this is an all-or-nothing feature; either all of that base class's constructors are forwarded or none of them are.
我有一个叫做MiscData
的class继承了QObject
并且有一个成员变量(模型)。然后是一堆继承 MiscData
的其他 classes 并重新实现其虚函数来填充模型。所以它看起来像这样:
class MiscData : public QObject
{
Q_OBJECT
public:
explicit MiscData(QObject *parent = 0);
QAbstractItemModel &model();
private:
virtual void loadData() = 0;
private:
QStandardItemModel m_Model;
}
其中一个后代看起来像这样:
class LogData : public MiscData
{
Q_OBJECT
public:
using MiscData::MiscData;
private:
virtual void loadData() override;
}
我知道我必须为 MiscData
使用显式构造函数,因为它会初始化模型成员变量。但是我想知道在派生的 class 中使用 using
指令来继承 MiscData
的构造函数是否安全。
编辑:根据答案,在 MiscData 中使用 using QObject::QObject
似乎也不错。
您可以在初始化列表中调用基础 class' 构造函数。
class LogData : public MiscData
{
Q_OBJECT
public:
explicit LogData(QObject *parent = 0) : MiscData(parent) {};
private:
virtual void loadData() override;
}
其中 MiscData
的构造函数应该以相同的方式将 parent
传递给 QObject
:
class MiscData : public QObject
{
Q_OBJECT
public:
explicit MiscData(QObject *parent = 0) : QObject(parent) {};
QAbstractItemModel &model();
private:
virtual void loadData() = 0;
private:
QStandardItemModel m_Model;
}
如果需要,可以将构造函数的定义移动到 .cpp
文件中。
using
只提供可用的东西,不调用任何东西。
看起来你所做的从 C++11 开始就完全正确了。
见Inheriting constructors and C++11 Object construction improvement。
Note that this is an all-or-nothing feature; either all of that base class's constructors are forwarded or none of them are.