2012-03-11 1 views
0

내가 추상 클래스에 대한 포인터의 배열을 말한다. 나는 다른 자리에 piecesQueen의 자리에 King을 할당 : 나는 할당 연산자를 오버로드하지 않은 경우 발생이로 인해 개체 조각이 생깁니 까?</p> <pre><code>Piece *pieces[2]; // where piece is an abstract class </code></pre> <p>을 그리고 <code>Piece</code>라는 <code>King</code> 및 <code>Queen</code>을 확장하는 두 개의 클래스가 있습니다

pieces[0] = new King(); 
pieces[1] = new Queen(); 

슬라이스는 무엇입니까? 또는 pieces[0]King의 인스턴스이고 pieces[1]Queen의 인스턴스입니까? 배열에서 무슨 일이 일어나고 있는지 (C++ 일 경우)?

편집 : 문제의 코드 예제 here을 참조하십시오.

+2

컴파일러 오류가없는 것처럼 가장 할 수는 있지만 결과 코드가 무엇인지 알 수있는 척할 수는 없습니다. 코드를 실제 C++로 수정하십시오. –

+0

@BenjaminLindley 오케이, 나는 내 질문에 가장 좋은 것이라고 생각하는 것으로 바 꾸었습니다. 나는 내 코드를 통해 잘못된 질문을 묘사하고 싶지 않았기 때문에 원래 코드가 구문에 대해 걱정하지 않고 아이디어를 묘사하도록 만들었습니다. –

+0

반갑습니다. 한 가지를 고쳐서 (역 참조 ('*') 제거), 다른 것을 파기했습니다 ('new' 대신'&'). 이제 코드가 컴파일되지만 수행중인 작업은 정의되지 않은 동작입니다 (작동하는 것처럼 보일지라도). 임시 객체를 만든 다음 주소를 저장하고 있습니다. 그러지 마. –

답변

4

이것은 실제로 컴파일되지 않습니다 : 당신이 Piece (식 *pieces[0]의 종류)에 King * (식 new King의 종류)를 할당 할 수 없습니다.

하지만, 당신의 암시 적 질문에 답 : 귀하의 질문에 배열에서

Piece *piece = new King(); // fine, no slicing, just assigning a pointer 
*piece = Queen();   // oops, slicing - assigning a Queen to a Piece 

, 당신은 등, pieces[0] = new King;를 기록했던 가정, 당신은 단지 두 Piece 포인터를 저장 할 것 중 하나가 포인트 King으로, 그 중 하나는 Queen을 가리 킵니다.

+0

고마워요. 내가 찾고있는 것이지. 컴파일되지 않는 코드에 대해서는 유감입니다. 저는 학생이고 개념에 대해 궁금해하고 있었지만 포인터 배열을 완전히 이해하려고합니다. 내가 코드를 테스트하고 컴파일 할 수있는 집에 도착했을 때 컴파일 할 코드를 변경하여 미래에이 질문을 보는 다른 사람들이 혼란스러워하지 않게 할 것입니다. –

+2

@AustinMoore : 인터넷에 연결되어 있다면 표준 라이브러리를 고수하는 한 항상 코드를 테스트 할 수 있습니다. http://ideone.com/ –

+0

@BenjaminLindley : 실제로 링크를 사용해 주셔서 감사합니다 :) 온라인으로 컴파일하는 데 http://www.comeaucomputing.com/tryitout하지만 링크 또는 실행되지 않습니다. –

1

슬라이스가 발생하지 않습니다. 당신은 객체 할당이 아니라 포인터 할당을하고 있습니다.

0

예 슬라이싱이 발생합니다.

파생 클래스 개체를 기본 클래스 중 하나에 넣으려고 할 때 항상 조각이 발생합니다. 파생 클래스가 기본 클래스에서 제공하지 않는 기능을 추가 한 경우이 조각이 표시됩니다.

OOP 보안 주체를 따르지 않는 경우입니다. 교장은 포인터 객체를 통해이 다음 공격 태도를 보여준 행동은 다음과 같이 정의 할 수 있습니다 교장

“Moving from specific behaviour to more general behaviour”. 

슬라이스를 따르는 경우 일시적이며 당신이 얻을 파생 된 클래스로 다시 포인터를 캐스팅 할 수 있습니다,

"When you are deriving from any class you should not change the interface. 
The reason for inheritance is moving from generic to specific type, and not 
providing new functionality." 

을 말한다 그리고 원래의 행동. 개체를 통해 슬라이스는 영구적입니다.

NOTE:- Slicing always does not happen in case of private inheritance. 
If you try to do so it will result in compilation error. 
(For more information on private inheritance:-http://stackoverflow.com/questions/19075517/object-slicing-in-private-inheritance/19083420?noredirect=1#19083420)