2015-03-31 1 views
1

J'ai une classe appelée MiscData qui hérite QObject et possède une variable membre (un modèle). Et puis tas d'autres classes qui héritent MiscData et réimplémenter sa fonction virtuelle pour peupler le modèle. Donc, il ressemble à ceci:Hériter du constructeur à partir de la classe QObject

class MiscData : public QObject 
{ 
    Q_OBJECT 
public: 
    explicit MiscData(QObject *parent = 0); 
    QAbstractItemModel &model(); 
private: 
    virtual void loadData() = 0; 
private: 
    QStandardItemModel m_Model; 
} 

et l'un des descendant ressemble à ceci:

class LogData : public MiscData 
{ 
    Q_OBJECT 
public: 
    using MiscData::MiscData; 
private: 
    virtual void loadData() override; 
} 

Je sais que je dois utiliser un constructeur explicite pour MiscData car il initialise la variable membre du modèle. Mais je me demande s'il est prudent d'utiliser la directive using dans la classe dérivée pour hériter du constructeur de MiscData comme ceci.

EDIT: Basé sur la réponse, il semble être bon événement à utiliser using QObject::QObject dans le MiscData aussi.

+0

Il est sûr. 'MiscData :: MiscData' est public. Quel problème as-tu? –

+0

@SaZ Je n'ai pas encore de problème. :-) Je me demandais juste s'il est sûr de le faire quand il y a QObject dans l'arbre d'héritage et la macro Q_OBJECT. Je ne savais pas si le constructeur d'une classe dérivée de QObject doit être explicite dans toutes les classes dérivées (pour définir des propriétés par exemple) ou je peux en hériter comme je l'ai montré. – Resurrection

+1

Dans votre cas, les prochains cteurs seront appelés: 'QObject (nullptr)' -> 'MiscData (0)' -> 'LogData()'. –

Répondre

3

On dirait que ce que vous faites est parfaitement exact depuis C++ 11.

Voir Inheriting constructors et C++11 Object construction improvement.

Notez qu'il s'agit d'une fonctionnalité tout ou rien; soit tous les constructeurs de cette classe de base sont transférés, soit aucun d'entre eux ne l'est.

1

Vous pouvez appeler le constructeur de la classe de base dans la liste des initialiseurs.

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

où le constructeur de MiscData devrait passer à la parentQObject de la même façon:

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; 
} 

La définition du constructeur peut être déplacé dans le fichier .cpp si vous voulez.

using suffit de rendre les choses disponibles et n'appelle rien.

+0

J'appelle le constructeur QObject dans la liste d'initialisation et je peux faire la même chose pour les classes dérivées (appelant le constructeur MiscData) mais je voulais l'éviter dans les classes dérivées dont je n'ai pas besoin. D'où ma question de savoir s'il est sûr d'hériter du constructeur de la classe dérivée de QObject ou si je devrais plutôt utiliser un constructeur explicite dans toutes les classes dérivées de QObject. En d'autres termes: je n'ai peut-être pas besoin du constructeur, mais QObject/Q_OBJECT pourraient être utiles! – Resurrection

+1

Votre vraie question est donc: le mot-clé explicite sera-t-il conservé lors de l'héritage des constructeurs? Je pense oui :) – paulm

+0

Oui et merci. :-) – Resurrection