2011-03-09 5 views
7

이것은 인터뷰 질문입니다. 나는 아직 C++ 전문가가 아니다 그래서 난이 질문에 대한 답을 찾는 데 도움이 필요 (내가 먼저 유효한 질문입니다 ... 질문을 이해하고 싶어?)C++ : 수퍼 클래스 메소드에 대한 액세스를 선택적으로 제한 하시겠습니까?

질문 :

가정하자 클래스 A에서 을 파생시킨 클래스 B가 있는데 A의 메소드 전부는 아니지만 일부는 다시 사용하려고합니다. 수퍼 클래스 메소드에 대한 액세스를 선택적으로 어떻게 제한합니까?

감사합니다!

+0

아마도 ** ** A ***의 방법 중 일부를 다시 사용하고 싶다는 뜻입니다. –

+0

예 .. 나는 정정을 했어. 감사합니다. – maxpayne

답변

10

나는

  1. 당신이 A에서 방법이 B 개체에서 액세스 할 수 있어야하는 선택합니다 A
  2. 의 정의를 변경할 수 있다고 가정합니다.

using 지시문은 문제를 해결합니다. 예 :

class A 
{ 
public: // or protected for that matter 
    void foo(); 
    void bar(); 
}; 

class B : private A // or protected, depending on whether 
        // you want subclasses of B to expose 
        // some methods from A themselves 
{ 
public: 
    using A::foo; 
}; 

클래스 B에서 사용할 수 foo 있지만 bar 있습니다. 그러나주의해야 할 점은 using A::foofoo의 모든 오버로드를 노출합니다.

+1

이것은 주어진 문제를 해결하는 좋은 해결책입니다. 그러나 클래스 B는 상속 계층 구조와 완전히 별개이므로 "B objB; A * ptrA = &objB;"과 같은 작업을 수행 할 수는 없습니다. AFAIK,이 질문에 대한 완벽한 만족할만한 해결책은 없습니다. – Baltasarq

+0

@Baltasarq :'A'에 대한 포인터를 통해 접근 할 수 있다면'A'의 메소드를 제한하는 것이 무엇입니까? 개인 상속은 ** "관계"가 아니라 **입니다. 그것은 단지 "일반"공용 상속과 원격으로 관련이 있으며 구성 장치로 간주되어야합니다. –

+0

당신은 "단점으로, A :: foo를 사용하면 foo의 모든 오버로드가 노출됩니다"라는 것을 설명 할 수 있습니까? – maxpayne

3

아마도 듣고 싶은 대답은 기본 클래스의 protected 섹션에 재사용 할 수있는 메서드를 넣을 수 있다는 것입니다. 파생 클래스에 표시되지 않아야하는 메서드는 private 섹션으로 이동해야합니다.

그러나 기능을 수행하는 방식에 따라 코드 재사용을위한 더 효과적인 방법이 있음을 지적하여 추가 점수를 얻을 수 있습니다 (예 : 헤더 파일).

+0

무료 기능이란 무엇입니까? – maxpayne

+0

@maxpayne : 일반 바닐라 기능, 즉. 귀하의 솔루션이 정말 간단하고 깨끗한 동안 회원 기능 ("방법") –

+0

되지 않은 기능 ... 하나는 클래스 A에서 코드를 변경할 수없는 경우 개최되지 않을 것 같아요 .. – maxpayne

관련 문제