标题文件:
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
的派生类。
但只有ColumnHelper
中的默认Main()
类。
修改
我希望在MainWindow()
中传递派生类,但是传递了基类。我怎样才能传递派生类?
答案 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
引用不能很好地使用指定为值的默认参数。)