2013-06-24 2 views
0

Visual C++ 프로젝트 및 C++/CLI 프로젝트를 포함한 Visual 솔루션 작업 중입니다.
는 I는 C++/CLI 프로젝트 클래스 계층 구조를 구현 :파생 클래스 가상 함수가 실행되지 않았습니다.

클래스 D => 클래스 C => 클래스 B => 급

=> 의미

클래스에서 파생 A ~ 클래스 D은 ref 클래스가 아닙니다.

클래스 A 다음과 같은 방법을 포함

virtual int MyMethod() const; 
MyMethod도 선언 클래스 D에 구현되어

:

A l_dObject = D(); 
l_dObject.MyMethod(); 
: 나는 C++ 프로젝트에 다음 코드를 작성했습니다

int MyMethod() const; 

클래스 AMyMethod이 실행되지만 클래스 DMyMethod이 실행될 것으로 예상됩니다. 누군가 내게 이유를 설명해 주시겠습니까?

답변

2

이것은 조각화로 알려져 있습니다.

D에서 A을 생성 중입니다. AA에서 복사 생성자를 제공하며 D이라는 정보가 없습니다. 복사 생성자에 D을 전달하고 (const A&처럼) 생성자는 행복하게 복사합니다. 여기서 모두 끝내면 A입니다. 할당 후 D이 삭제됩니다.

이 문제점에 대한 대부분의 솔루션은 힙 및 포인터/참조에 대한 할당을 포함합니다.

A *l_dObject = new D(); // allocate our D on the heap 
... 
delete l_dObject; // don't forget to delete afterwards 
+0

이를 방지하려면 다형성으로 사용되는 클래스의 복사본을 금지하는 것이 좋습니다. – Medinoc

2
A l_dObject = D(); 

당신은 객체를 얇게하고 있습니다 : 그것은 당신이 개체의 A 부분의 복사를하고 D 부분을 폐기하는 것을 의미한다. 다형성 객체를 처리 할 때 포인터 또는 기본 클래스에 대한 참조를 사용해야합니다. 예 :

A* l_dObject = new D(); 

나중에 delete을 잊지 마세요.

관련 문제