2015-01-07 5 views
0

각각 순수 가상 메소드는 직접 파생 클래스에서만 구현되어야합니다. 이유는 무엇입니까?

class A 
{ 
    virtual void print() = 0; 
}; 

class B : public A 
{ 
    void print(); 
}; 

//print() must be implemented 
void B::print() 
{ 
    std::cout << "Hello" << std::endl; 
} 

class C : public B 
{ 
    //print() does not require to be implemented 
}; 

가 나는 그것의 바로 위 부모 BC의 관점에서, 인쇄()가 순수 가상 아니라는 것을 이해하는 추상 클래스 A과 두 개의 클래스 B & C A에서 파생 B 존재한다고 가정 메서드가 있지만 C 님의 조부모 인 A의 관점에서 print()는 순수한 가상 메서드입니다. 따라서 C에도 구현해야합니까?

+1

왜'C'는'B'가 모든 좋은 점을 제공하는지 신경 써야합니까? 순수 가상 함수는 파생 클래스에서 구현할 필요가 없습니다. 그들은 파생 클래스가 순수 가상 함수를 가지지 않도록 구현되어야하며, 따라서 인스턴스화 할 수 없습니다. – Deduplicator

+0

C는 B에서 구현을 상속하므로 제공 할 필요가 없습니다. 그러나 B는 순수 가상이기 때문에 A에서 하나를 얻지 못합니다. – Borgleader

+1

나는이 두 가지 "관점"이 의미하는 바를 모른다. 이 함수는 비 순 위 오버라이드를 가지고 있으므로 모두 좋다. 존재하는 한 오버라이드가 계층 구조에있는 정확한 위치는 중요하지 않습니다. –

답변

5

C 구현을 얻는 방법을 "신경 쓰지"않습니다. 그리고 B에서 가져옵니다. 그러나 Bprint의 어떤 구현을받지 못하기 때문에 자신의

편집print를 구현해야합니다 : 아래의 코멘트를, 구현이 가상 순수로 표시해서는 안됩니다 다시 당신은 모두를위한 정의가 필요

+2

구현만으로는 충분하지 않습니다. 구현자는 순수 가상 (* 다시)으로 표시해서는 안됩니다. – Deduplicator

+0

@Deduplicator 순수 가상의 구현을 제공 할 수는 없지만 구현을 제공했다는 사실을 밝히는 것으로 충분합니다. 순수 가상이 아니라는 사실이 암시 될 수 있으므로 sedavidw의 진술은 완전하고 비 재수정 적입니다. –

+5

@ Zadirion : "순수 가상의 구현을 제공 할 수 없습니다 ..."? 그냥 시도해보십시오. 멋지게 작동합니다. – Deduplicator

0

ODR 사용이며 가상 함수는 항상 클래스 (vtable)에서 ODR 사용됩니다.

물론 순수 가상으로 표시되어 있지 않는 한.

클래스는 추상 클래스이며 적어도 하나의 순수 가상 멤버가있는 경우 인스턴스를 생성 할 수 없습니다.
해당 멤버가 상속되었는지 여부는 중요하지 않지만 상속은 기본 클래스에서만 직접 발생합니다.

순수 가상이라는 것은 사실상 비공개가 아니기 때문에 사실상 정의되지 않고 가상이 아닌 호출을 허용합니다.