2016-10-08 2 views
1

헤더 파일 :만 기본 인수 작업

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()에 전달 될 수 있지만, 기본 클래스 전달합니다. 어떻게 파생 클래스를 전달할 수 있습니까?

+1

차이점을 어떻게 알 수 있습니까? 둘 다 기본값으로 생성됩니다. –

+0

나는 이해하지 못했다. – v78

+0

'SpreadColumnHelper column_helper;'는 기본 인수와 마찬가지로 기본 생성자를 사용합니다. 따라서 차이를 구분하기가 어려울 것입니다. –

답변

2

MainWindow의 매개 변수는 ColumnHelper 유형의 직접 개체로 선언되므로 항상 ColumnHelper 유형의 개체가됩니다. 그것은 당신이 인수로 전달하는 것에 관계없이 어떻게 든 그것의 타입을 변경하는 것은 불가능합니다.

SpreadColumnHelper을 인수로 전달하려고하면 기본 서브 개체 인 ColumnHelper으로 "조각"됩니다. 그 ColumnHelper 개체는 MainWindow (정확하게 당신이 관찰하는 것입니다)에 의해 받게됩니다. 당신이 당신의 column_helper 매개 변수 다형을 작동하려면

, 당신은 예를 들어, 포인터 또는 ColumnHelper에 대한 참조 중 하나로 선언해야

MainWindow(QWidget *parent, ColumnHelper &column_helper) 

또는 매개 변수가 const를 참조로 선언 된 경우 기본 인수로 임시 객체를 제공하는 경우에만 가능하다는 것을 어쩌면

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

참고.

1

SpreadColumnHelper의 기본 생성자가 기본 생성자가 ColumnHelper 인 다른 반환 값을 갖고 있는지 확인하십시오. 나는이 두 가지 기본 생성자가 동일한 구현을하기 때문에 그렇게 생각한다.

1

이유는 함수의 두 번째 인수가 값으로 전달되기 때문입니다. 파생 된 유형의 객체를 전달할 때 제공된 객체의 ColumnHelper 부분 만 사용하여 ColumnHelper 객체가 만들어지고 이것은 함수가받는 것입니다. 이것은 객체 조각화 (object slicing)로 묘사됩니다 - 전달 된 객체의 일부만의 복사본이 함수에 의해 수신됩니다.

두 번째 인수를 const 참조로 변경하십시오 (비 - const 참조가 값으로 지정된 기본 인수로 제대로 재생되지 않음).

+0

감사, 설명을 위해. 그것은 내 문제를 해결했다. 죄송합니다. 불행히도 2 답변을 수락 할 수 없습니다. – v78