只有默认参数有效

Only default argument working

头文件:

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 的派生 class。

但是在Main().

中只得到了默认的ColumnHelperclass

编辑

我希望在 MainWindow() 中传递派生的 class,但传递了基础 class。如何传递派生的 class?

您确定 SpreadColumnHelper 的默认构造函数与 ColumnHelper 的默认构造函数具有不同的 return 值?我猜是因为这两个默认构造函数具有相同的实现。

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

尝试将 SpreadColumnHelper 作为参数传递只会导致它获得 "sliced" 到其 ColumnHelper 基础子对象。 ColumnHelper 对象将被 MainWindow 接收(这正是您所观察到的)。

如果您希望 column_helper 参数表现出 多态性 ,您必须将其声明为指针或对 ColumnHelper 的引用,例如

MainWindow(QWidget *parent, ColumnHelper &column_helper)

或者也许

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

请注意,只有当参数声明为常量引用时,才能提供临时对象作为默认参数。

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

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