只有默认参数工作

时间:2016-10-08 06:25:43

标签: c++ qt default-value function-calls

标题文件:

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

.cpp档案:

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

用法:

SpreadColumnHelper column_helper;
MainWindow w(0,column_helper);

SpreadColumnHelperColumnHelper的派生类。

但只有ColumnHelper中的默认Main()类。

修改

我希望在MainWindow()中传递派生类,但是传递了基类。我怎样才能传递派生类?

3 个答案:

答案 0 :(得分:2)

由于MainWindow的参数被声明为类型ColumnHelper的直接对象,因此它始终是ColumnHelper类型的对象。无论你作为一个论点传递什么,它都不可能以某种方式改变它的类型。

尝试传递SpreadColumnHelper作为参数只会导致它被“切片”到其ColumnHelper基础子对象。 ColumnHelper将收到MainWindow个对象(这正是您所观察到的)。

如果您希望column_helper参数以多态行事,则必须将其声明为指针或对ColumnHelper的引用,例如

MainWindow(QWidget *parent, ColumnHelper &column_helper)

或者

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

请注意,只有将参数声明为const引用时,才可以提供临时对象作为默认参数。

答案 1 :(得分:1)

您确定 SpreadColumnHelper 的默认构造函数具有不同的返回值,默认构造函数为ColumnHelper吗?我想这是因为这两个默认构造函数具有相同的实现。

答案 2 :(得分:1)

原因是函数的第二个参数是按值传递的。传递派生类型的对象时,仅使用提供的对象的ColumnHelper部分创建ColumnHelper对象,这是函数接收的内容。这被描述为对象切片 - 函数只接收部分传递对象的副本。

将第二个参数更改为const引用(非const引用不能很好地使用指定为值的默认参数。)