2012-11-27 3 views
3

: 지금은 기본 클래스에서 어떤 클래스를 파생시키는 경우C++은 기본 클래스 자체의 추상 클래스의 추상 메서드를 재정의합니까? 나는 그래서 기본 클래스가있는 경우

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

를, 그것은 foo()를 재정의해야합니다.

foo()의 기본 클래스에도 동작을 원한다면 어떻게해야합니까? 그래서 그 기본 클래스는 자신의 foo, 그리고 그것의 모든 하나는 foo을 재정의해야하나요? 그게 가능하니? 클래스는 추상적 남아

class Base { 
    ... 
    virtual void foo()=0; 
} 

void Base::foo() { 
    ... implementation goes here ... 
} 

:

+0

그래도 여전히 기본 클래스를 인스턴스화 할 수 있기를 원하지만 하위 클래스를 파생하는 경우 하위 클래스가이 메서드를 재정의했는지 확인해야합니다. –

+0

맞습니다. –

+0

@Mahi : 당신이 제안하고있는 것을 왜해야하는지에 관해서는 좀 더 많은 문맥을 제공 할 수 있습니까? 내 대답을 쓰는 동안, 나는 상상해 보려고 노력했지만 할 수 없었다. –

답변

4

당신이 경우에 같은 것을 : 당신은 당신이 하지 클래스 자료의 b를 객체를 생성 할 수 있도록, 추상 클래스를 취득하고 foo는의 구현을 사용하는 것입니다

class Base { 
    public: 
     Base(){} 
     virtual void foo() = 0; 
}; 
void Base::foo() { 
{ 
    cout << "Hello"; 
} 

() b.foo()를 호출하여.

그래서 원하는 것이 아닙니다! 다음 질문은 당신이 Base :: foo에 대한 구현을 제공 할 수 없다는 것입니다. 글쎄, 실제로 할 수있어! 직접은 아니지만. 이 자료 :: foo는 볼 수 있듯이

class Deriv : public Base { 
    public: 
     Deriv(){} 
     virtual void foo(); 
}; 
void Deriv::foo() 
{ 
    Base::foo(); cout << " world!"; 
} 

은() 파생 클래스에서 사용할 수 있습니다.

질문으로 돌아 가기. 대답은 입니다.은 기본 클래스가 추상이라는 점을 제외하고는 사용자가 지정한 것을 정확하게 수행합니다.

대체 방법은 Base에서 foo()를 구현할 때 대부분의 사람들이하는 일을하고 0은 지정하지 않는 것입니다. 즉 파생 클래스 수 있습니다 foo() 무시하지만 가지고 있지 않습니다. 이것은 실제로 나에게 완벽하게 이해하는 것처럼 보입니다. Base :: foo()의 기본 구현이 의미있는 파생 클래스에서는 유지하지만 다른 무언가가 필요한 경우에는 재정의합니다.

업데이트 : 사실은 질문에 대해 요구하고 무엇을 요구하는 시나리오를 마련하려고이 함께했다 :

이 문서와 그 파생 클래스가 문서 유형을 대표하고 그 문서는 가상 메소드를 포함 상상 getClassIcon() 문서 형을 나타내는 아이콘의 이미지 파일의 URL를 리턴합니다. Document에는 아이콘 (일반적인 문서를 나타내는 무언가)이 있고, 모든 파생 클래스가 getClassIcon()을 재정 의하여 자신의 아이콘을 제공하도록 요구하는 것은 의미가 있습니다.

이 특별한 예제에서, Document : getClassIcon()을 순수 가상 메서드 (= 0)로 만들고 (Document를 추상 클래스로 만들기), OtherDocument를 그 중 하나 이전에 가지고 있던 getClassIcon Document의 구현을 제공합니다. PDFDocument, MSWordDocument 등은 모두 필요에 따라 getClassIcon()을 재정의해야합니다. 이 재 설계가 드러날 수 있었던 것은 이전의 설계 (질문이 요구하는 것을 허용하는 상상의 버전의 C++에 의해 지원됨)가 기본 클래스 인 Document와 서있는 클래스의 역할을 결합 했었다는 것입니다 알려진 유형에 속하지 않는 문서의 경우 OtherDocument. 물론 모든 사람들이 볼 수 있습니다 :-) 두 번째 디자인은 언어에서 빠진 기능으로 인해 단지 필요한 것이라고 주장 할 수 있습니다. 우리가 말하는 (컴퓨터) 언어에 따라 (대부분) 생각합니다. :-)

+0

그래, 며칠 전 이미 "업데이트"방법을 생각해 봤는데, 그게 내가 사용했던거야. 다른 수업이 필요하지 않은 곳에 궁금 해서요. 그러나 나는 다른 방법이 없다고 생각합니다. 나는 심지어 당신을 도울 것입니다. 도저히 도와주지는 않았지만, 여전히 정확합니다. :) –

+0

@Mahi 두 사람이 나왔다고해도 ​​아이디어를 교환하는 것이 좋습니다. 똑같은 아이디어. 프로젝트에 대한 답변과 행운을 수락 해 주셔서 감사합니다. –

3

당신은 순수 가상 메서드에 대한 구현을 제공 할 수있다. 추상화하지 않으려면 =0을 제거해야합니다. 그러나 일단 그렇게하면 파생 클래스가 자체 구현을 제공하도록 강요 할 수 없습니다.

즉, 선택을해야합니다.

+0

편집 : 오타가 있었지만 지금 다른 오류가 있습니다. 'error : 함수 정의에 대한 순수 지정자' –

+0

그냥 궁금해서 ... 추상 클래스를 인스턴스화 할 수없고 파생 클래스를 자신의 구현을 제공한다면 왜 순수 가상 메서드를 구현할 수 있습니까? –

+0

@SidharthMudgal : 가장 일반적인 사용 사례는 아마도 순수 가상 소멸자 일 것입니다. http://stackoverflow.com/questions/1219607/why-do-we-need를 참조하십시오. -a-pure-virtual-destructor-in-c – NPE

관련 문제