2016-10-08 3 views
1

fichier d'en-tête:argument par défaut uniquement travailler

MainWindow(QWidget *parent = 0, ColumnHelper column_helper = ColumnHelper()); 

fichier .cpp:

MainWindow::MainWindow(QWidget *parent, ColumnHelper column_helper) 

Utilisation:

SpreadColumnHelper column_helper; 
MainWindow w(0,column_helper); 

SpreadColumnHelper est la classe dérivée de ColumnHelper.

Mais seule la classe par défaut ColumnHelper est obtenue en Main().

EDIT

Je veux la classe dérivée à passer dans MainWindow() mais la classe de base est passée. Comment puis-je passer la classe dérivée?

+1

Comment pouvez-vous faire la différence? Les deux sont construits par défaut. –

+0

Je n'ai pas compris. – v78

+0

'SpreadColumnHelper column_helper;' utilise le constructeur par défaut, tout comme l'argument par défaut. Par conséquent, il sera difficile de faire la différence. –

Répondre

2

Étant donné que le paramètre MainWindow est déclaré comme objet immédiat de type ColumnHelper, ce sera toujours un objet du type ColumnHelper. Il est impossible pour lui de changer d'une manière ou d'une autre son type, indépendamment de ce que vous passez comme argument.

Si vous tentez de passer un SpreadColumnHelper en tant qu'argument, le sous-objet de base ColumnHelper sera "tronqué". Cet objet ColumnHelper sera reçu par MainWindow (ce qui est exactement ce que vous observez).

Si vous voulez que votre paramètre column_helper se comporter polymorphically, vous devez déclarer soit comme un pointeur ou une référence à ColumnHelper, par exemple

MainWindow(QWidget *parent, ColumnHelper &column_helper) 

ou peut-être

MainWindow(QWidget *parent = 0, const ColumnHelper &column_helper = ColumnHelper()) 

Notez que la fourniture d'un objet temporaire comme argument par défaut est possible uniquement si le paramètre est déclaré comme une référence const.

1

Vous êtes sûr que le constructeur par défaut de SpreadColumnHelper a une valeur de retour différente avec le constructeur par défaut de ColumnHelper? Je suppose que parce que ces deux constructeurs par défaut a la même réalisation.

1

La raison est que le second argument de la fonction est transmis par valeur. Lors du passage d'un objet de type dérivé, un objet ColumnHelper est créé, en utilisant seulement ColumnHelper parties de l'objet fourni et c'est ce que la fonction reçoit. Ceci est décrit comme un découpage d'objet - une copie de seulement une partie de l'objet transmis est reçue par la fonction.

Remplacez le deuxième argument par une référence const (une référence non const ne fonctionne pas correctement avec les arguments par défaut spécifiés en tant que valeur).

+0

Merci, pour la clarification. Cela a résolu mon problème. Désolé, je ne pouvais pas accepter 2 réponses, malheureusement. – v78