당신이 경우에 같은 것을 : 당신은 당신이 하지 클래스 자료의 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. 물론 모든 사람들이 볼 수 있습니다 :-) 두 번째 디자인은 언어에서 빠진 기능으로 인해 단지 필요한 것이라고 주장 할 수 있습니다. 우리가 말하는 (컴퓨터) 언어에 따라 (대부분) 생각합니다. :-)
그래도 여전히 기본 클래스를 인스턴스화 할 수 있기를 원하지만 하위 클래스를 파생하는 경우 하위 클래스가이 메서드를 재정의했는지 확인해야합니다. –
맞습니다. –
@Mahi : 당신이 제안하고있는 것을 왜해야하는지에 관해서는 좀 더 많은 문맥을 제공 할 수 있습니까? 내 대답을 쓰는 동안, 나는 상상해 보려고 노력했지만 할 수 없었다. –