只有默认参数有效
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);
SpreadColumnHelper
是 ColumnHelper
的派生 class。
但是在Main()
.
中只得到了默认的ColumnHelper
class
编辑
我希望在 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
引用不能很好地使用指定为值的默认参数)。
头文件:
MainWindow(QWidget *parent = 0, ColumnHelper column_helper = ColumnHelper() );
.cpp
文件:
MainWindow::MainWindow(QWidget *parent, ColumnHelper column_helper)
用法:
SpreadColumnHelper column_helper;
MainWindow w(0,column_helper);
SpreadColumnHelper
是 ColumnHelper
的派生 class。
但是在Main()
.
ColumnHelper
class
编辑
我希望在 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
引用不能很好地使用指定为值的默认参数)。