2015-03-31 1 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 следующим образом.

РЕДАКТИРОВАТЬ: На основе ответа, кажется, что прекрасное событие использовать using QObject::QObject в MiscData тоже.

+0

Это безопасно. 'MiscData :: MiscData' является общедоступным. Какая у вас проблема? –

+0

@SaZ У меня пока нет проблем. :-) Мне просто интересно, безопасно ли это делать, когда в дереве наследования есть QObject и макрос Q_OBJECT. Я не знал, должен ли конструктор производного класса QObject быть явным во всех производных классах (для установки свойств для примера), или я могу наследовать его так же, как я показал. – Resurrection

+1

В вашем случае будут вызываться следующие ctors: 'QObject (nullptr)' -> 'MiscData (0)' -> 'LogData()'. –

ответ

3

Похоже, что вы делаете совершенно правильно, так как C++ 11.

См. Inheriting constructors и C++11 Object construction improvement.

Обратите внимание, что это функция «все или ничего»; либо все конструкторы этого базового класса пересылаются, либо ни один из них не является.

1

Вы можете вызвать конструктор базового класса в списке инициализаторов.

class LogData : public MiscData 
{ 
    Q_OBJECT 
public: 
    explicit LogData(QObject *parent = 0) : MiscData(parent) {}; 
private: 
    virtual void loadData() override; 
} 

где конструктор MiscData «s должен пройти 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

+1

Итак, ваш реальный вопрос в том, будет ли явное ключевое слово перенесено при наследовании конструкторов? Я думаю, да :) – paulm

+0

Да и спасибо. :-) – Resurrection