2015-03-31 193 views
1

我有一个类MiscData继承QObject并有一个成员变量(模型)。然后一堆继承MiscData的其他类并重新实现其虚拟函数来填充模型。所以它看起来像这样:从基于QObject的类继承构造函数

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。但我想知道在派生类中使用using指令是否安全继承MiscData的构造函数是这样的。

编辑:基于这个答案,在MiscData中使用using QObject::QObject似乎也不错。

+0

它是安全的。 'MiscData :: MiscData'是公开的。你有什么问题? – 2015-03-31 08:26:06

+0

@SaZ我没有问题呢。 :-)我只是想知道在继承树和Q_OBJECT宏中有QObject时是否安全。我不知道QObject派生类的构造函数是否必须在所有派生类中显式化(例如设置属性),或者我可以继承它,就像我展示的那样。 – Resurrection 2015-03-31 08:36:18

+1

在你的情况下,下一个ctors将被调用:'QObject(nullptr)' - >'MiscData(0)' - >'LogData()'。 – 2015-03-31 08:51:38

回答

1

您可以在初始化程序列表中调用基类的构造函数。

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只是使东西可用,并没有调用任何东西。

+0

我确实在初始化程序列表中调用了QObject构造函数,并且我可以为派生类(调用MiscData构造函数)做同样的事情,但是我想避免它在派生类中通常不需要它。因此,我的问题是继承QObject派生类的构造函数是否安全,或者我应该在所有QObject派生类中使用显式构造函数。换句话说:我可能不需要构造函数,但QObject/Q_OBJECT相关的东西可能! – Resurrection 2015-03-31 08:39:19

+1

所以你真正的问题是继承构造函数时,显式关键字会继承吗?我想是的:) – paulm 2015-03-31 08:41:49

+0

是的,谢谢。 :-) – Resurrection 2015-03-31 08:58:58