2012-05-25 3 views
1

나는 항목 컬렉션을 관리하는 프로그램을 만들고 있습니다. 책, 잡지, CD 또는 DVD가 될 수 있습니다. 그것들 각각은 클래스 Item을 상속받은 클래스입니다. 이 같은 목록 서식 파일을 사용하고 내가 그 항목을 저장하려면파생 클래스의 호출 메서드

list<Item> items; 

을이 목록은 클래스 라이브러리의 객체 lib 디렉토리 안에 있습니다.

내가이 일을하고있어,이 목록을 실행하려면 다음

for(list<Item>::iterator i = lib.itens.begin(); i != lib.itens.end(); ++i) 

을이 시점에서 모든 게 잘 때까지. 문제는이 루프 내부에서 파생 클래스의 메서드를 호출하려고 할 때 시작됩니다. 예 :

for(list<Item>::iterator i = lib.itens.begin(); i != lib.itens.end(); ++i) 
     (*i).lib.itens.show(); 

어떻게 이러한 메소드를 호출 할 수 있습니까?

답변

2

여기에 적어도 두 가지 문제가 있습니다. 첫째, 당신이 할 경우이 :

list<Item> items; 

다음이 목록은 정말에만 Item 객체를 포함 할 것이다; 파생 된 객체를 넣으려고하면 파생 부분은 sliced off이됩니다.

한 가지 해결책은 대신 포인터 목록을 사용하는 것입니다 (메모리 관리 문제를 피하기 위해 스마트 포인터를 사용해야 할 수도 있음).

그러나 두 번째 문제는 (일반적으로) 기본 클래스에 대한 포인터를 통해 파생 클래스 별 메서드를 호출하지 않아야한다는 것입니다. 다형성의 전체적인 포인트는 전체 계층 구조에 공통적 인 기능을 사용하여 기꺼이 작업한다면 기본 클래스 포인터에 대해서만 다루어야한다는 것입니다 (Liskov substitution principle 참조).

+0

좋아요. 파생 클래스의 개체를 저장할 수있는 목록을 어떻게 만들 수 있습니까? – Gonzo

+0

목록 대신 목록 을 사용해야합니다. 참조는 다형성입니다. – Carl

+0

및 해당 항목에 액세스하는 방법? 목록에 항목을 추가 하시겠습니까? – Gonzo

0

class Itemvirtual void show() = 0;을 정의했을 것입니다. 그럴 경우 show 전화가 합법적 이었지만 동시에 list<Item>에 오류가 발생했습니다.

근본적인 오류는 "그냥"Item 인 것을 가질 수 없다는 것입니다. 그러나 list<Item>은 정확하게 그 목록을 만들려고 시도합니다. showItem에 순수 가상 함수로 선언하면 컴파일러에서이를 분명히 알 수 있습니다.

관련 문제