2016-07-21 7 views
1

개체와 개체 모음이 비슷한 방식으로 동작하는 경우가 있습니다. 그래서했습니다 클래스 개체를 나타내는 :어떻게 구성 및 상속을 함께 사용합니까?

class A { 
public: 
    virtual void foo(); 
protected: 
    int x; 
}; 

을 그리고 개체의 컬렉션을 나타 내기 위해, 나는 다른 클래스를했습니다 :

class Collection: public A { 
    void foo(); //override base class function 
private: 
    vector<A*> aList; 
} 

이 괜찮지 만, 문제는 그 컬렉션 클래스입니다 내가 필요로하지 않는 A :: x 사본을 갖게 될 것입니다. 클래스 Collection에서 데이터 멤버를 상속 받기를 원하지 않습니다. 이것을 어떻게 성취합니까?

참고 : 라이브러리에있는 "클래스 A"는 편집 할 수 없습니다. 수정 사항 : A. 인터페이스를 변경할 수 없습니다. 나머지 코드에서 A가 사용되고 있습니다. 구현을 수정할 수 있습니다. 이미 virtual이 아닌 경우 A :: anyFunction()을 virtual로 변경할 수 있습니다. 개인 회원을 보호 대상으로 변경할 수 있습니다.

당신은 인터페이스를 사용할 수 있습니다
+0

를' Collection :: x'와'A :: x'는 같은'x'입니다. – LogicStuff

+0

그 점을 이해합니다. 하지만 Collection 클래스에서 데이터 멤버가 필요하지는 않습니다. –

+0

다형성 A를 기대하는 함수를 편집 할 수 있습니까? – StoryTeller

답변

1

:

class AInterface { 
public: 
    virtual void foo() = 0; 
}; 

다음

class A : public AInterface { 
    /*...*/ 
}; 

class Collection : public AInterface { 
    /*...*/ 
}; 

을 경우 당신은 여전히 ​​래퍼 작성하여, 인터페이스를 사용할 수 A 캔트 편집 :

class AWrapper : public AInterface { 
    void foo() { a.foo(); } 
private: 
    A a; 
}; 
+0

방금 ​​메모를 추가했습니다. –

+0

@PramodT 수업 자료를보고 편집했습니다. – user463035818